簡體   English   中英

將 SQL 數據從一個表移動到另一個表

[英]Move SQL data from one table to another

我想知道是否可以將與某個查詢匹配的所有數據行從一個表移動到另一個表?

例如,我需要將所有表行從表 1 移動到表 2,其中它們的用戶名 = 'X' 和密碼 = 'X',這樣它們就不會再出現在表 1 中。

我正在使用 SQL Server 2008 Management Studio。

應該可以在一個事務中使用兩個語句,插入和刪除:

BEGIN TRANSACTION;
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;

DELETE FROM Table1
WHERE <condition>;

COMMIT;

這是最簡單的形式。 如果您必須擔心在兩個語句之間將新的匹配記錄插入到 table1 中,您可以添加一個and exists <in table2>

這是一篇古老的帖子,抱歉,但我現在才發現它,我想將我的解決方案提供給有一天可能會偶然發現的人。

正如一些人所提到的,先執行INSERT然后執行DELETE可能會導致完整性問題,因此,也許可以繞過它並在單個語句中整齊地執行所有操作的方法是利用[deleted]臨時表。

DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)

所有這些答案都對 INSERT 和 DELETE 運行相同的查詢。 如前所述,這可能會導致 DELETE 獲取語句之間插入的記錄,並且如果查詢很復雜,可能會很慢(盡管聰明的引擎“應該”使第二次調用更快)。

正確的方法(假設 INSERT 是到一個新表中)是使用 table2 的鍵字段對 table1 執行 DELETE。

刪除應該是:

DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)

請原諒我的語法,我在引擎之間跳躍,但你明白了。

是的。 首先 INSERT + SELECT 然后 DELETE 原件。

INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'

然后刪除原文

DELETE FROM Table1 WHERE UserName='X' AND Password='X'

您可能希望保留UserID或其他主鍵,然后您可以使用IDENTITY INSERT來保留該鍵。

在 MSDN 上查看有關 SET IDENTITY_INSERT 的更多信息

更清晰地表示其他一些答案所暗示的內容:

DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>

使用這個單一的 sql 語句是安全的,不需要提交/回滾多個語句。

INSERT Table2 (
      username,password
) SELECT username,password
      FROM    (
           DELETE Table1
           OUTPUT
                   DELETED.username,
                   DELETED.password
           WHERE username = 'X' and password = 'X'
      ) AS RowsToMove ;

在 SQL 服務器上工作對 MySql 進行適當的更改

您應該能夠在 INSERT 語句中使用子查詢。

INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;

然后從table1中刪除。

請記住將其作為單個事務運行,以便如果出現任何問題,您可以回滾整個操作。

試試這個

INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria

然后

DELETE FROM TABLE1 WHERE Criteria

你可以試試這個:

SELECT * INTO tbl_NewTableName 
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

然后運行一個簡單的刪除:

DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

您可以使用“邏輯分區”在表之間切換數據:

通過更新分區列,數據將自動移動到另一個表:

這是示例:

CREATE TABLE TBL_Part1
(id  INT NOT NULL,
 val VARCHAR(10) NULL,
 PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part1 CHECK(PartitionColumn = 'TBL_Part1'),
 CONSTRAINT TBL_Part1_PK PRIMARY KEY(PartitionColumn, id)
);

CREATE TABLE TBL_Part2
(id  INT NOT NULL,
 val VARCHAR(10) NULL,
 PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part2 CHECK(PartitionColumn = 'TBL_Part2'),
 CONSTRAINT TBL_Part2_PK  PRIMARY KEY(PartitionColumn, id)
);

GO

CREATE VIEW TBL(id, val, PartitionColumn)
WITH SCHEMABINDING
AS
     SELECT id, val, PartitionColumn FROM dbo.TBL_Part1
     UNION ALL  
     SELECT id, val, PartitionColumn FROM dbo.TBL_Part2;

GO

--Insert sample to TBL ( will be inserted to Part1 )
INSERT INTO TBL
VALUES(1, 'rec1', 'TBL_Part1');

INSERT INTO TBL
VALUES(2, 'rec2', 'TBL_Part1');

GO

--Query sub table to verify
SELECT * FROM TBL_Part1

GO
--move the data to table TBL_Part2 by Logical Partition switching technique
UPDATE TBL
  SET
      PartitionColumn = 'TBL_Part2';

GO

--Query sub table to verify
SELECT * FROM TBL_Part2

這是使用單個語句的方法

WITH deleted_rows AS (
DELETE FROM source_table WHERE id = 1
RETURNING *
) 
INSERT INTO destination_table 
SELECT * FROM deleted_rows;

例子:

    postgres=# select * from test1 ;
 id |  name
----+--------
  1 | yogesh
  2 | Raunak
  3 | Varun
(3 rows)


postgres=# select * from test2;
 id | name
----+------
(0 rows)


postgres=# WITH deleted_rows AS (
postgres(# DELETE FROM test1 WHERE id = 1
postgres(# RETURNING *
postgres(# )
postgres-# INSERT INTO test2
postgres-# SELECT * FROM deleted_rows;
INSERT 0 1


postgres=# select * from test2;
 id |  name
----+--------
  1 | yogesh
(1 row)

postgres=# select * from test1;
 id |  name
----+--------
  2 | Raunak
  3 | Varun

如果兩個表使用相同的 ID 或有一個共同的 UNIQUE 鍵:

1)在表2中插入選中的記錄

INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)

2) 如果存在於 table2 中,則從 table1 中刪除所選記錄

DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND  (A.ID = B.ID)

它將創建一個表並將所有數據從舊表復制到新表

SELECT * INTO event_log_temp FROM event_log

並且可以清除舊表數據。

DELETE FROM event_log

對於某些情況,最簡單的方法是編寫 Table1 腳本,將現有的 Table1 重命名為 Table2,然后運行腳本重新創建 Table1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM