将SQL数据从一个表移动到另一个表

我想知道是否有可能将所有行的数据从一个表移动到另一个表,匹配某个查询?

例如,我需要将Table1中的所有表行移至Table2,其中用户名='X'和密码='X',以便它们不会再出现在Table1中。

我正在使用SQL Server 2008 Management Studio。

谢谢。

应该可以在一个事务中使用两个语句,一个插入和一个删除:

INSERT INTO Table2 (<columns>) SELECT <columns> FROM Table1 WHERE <condition>; DELETE FROM Table1 WHERE <condition>; COMMIT; 

这是最简单的forms。 如果您不得不担心在两个语句之间插入table1的新匹配logging,可以添加一个and exists <in table2>

这是一个古老的post,对不起,但我现在只是碰到它,我想给我的解决scheme谁可能有一天偶然发生。

正如一些人所说,执行INSERT然后执行DELETE可能会导致完整性问题,所以也许是一种解决方法,并且在一个语句中整齐地执行所有的事情,就是利用[deleted]临时表。

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

所有这些答案对INSERT和DELETE运行相同的查询。 如前所述,这会使DELETE拾取在语句之间插入的logging,如果查询很复杂(尽pipe聪明的引擎“应该”快速地进行第二个调用),这可能会很慢。

正确的方法(假设INSERT是在一个新的表中)是使用table2的键字段对table1执行DELETE。

删除应该是:

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

请原谅我的语法,我在引擎之间跳跃,但你明白了。

是的。 先执行INSERT + SELECT,然后删除orginals。

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

然后删除orginals

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

您可能想要保留UserID或其他主键,那么您可以使用IDENTITY INSERT来保存密钥。

请参阅MSDN上SET IDENTITY_INSERT的更多信息

您应该可以在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 

这是如何与单一的陈述

 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 

你可以试试这个:

 SELECT * INTO tbl_NewTableName FROM tbl_OldTableName WHERE Condition1=@Condition1Value 

然后运行一个简单的删除:

 DELETE FROM tbl_OldTableName WHERE Condition1=@Condition1Value 

如果这两个表使用相同的ID或具有一个通用的UNIQUE键:

1)在表2中插入选定的logging

 INSERT INTO table2 SELECT * FROM table1 WHERE (conditions) 

2)如果出现在表2中,则从表1中删除选定的logging

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

您可以使用“逻辑分区”在表之间切换数据:

通过更新分区列,数据将被自动移动到另一个表中:

这里是样本:

 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 

使用这个单一的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 Server上工作,对MySql做适当的修改