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

时间:2009-10-23 09:13:16

标签: sql sql-server

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

例如,我需要将所有表格行从Table1移动到Table2,其中username ='X'和password ='X',这样它们将不再出现在Table1中。

我正在使用SQL Server 2008 Management Studio。

13 个答案:

答案 0 :(得分:98)

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

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

DELETE FROM Table1
WHERE <condition>;

COMMIT;

这是最简单的形式。如果您不得不担心在两个语句之间插入到table1中的新匹配记录,则可以添加and exists <in table2>

答案 1 :(得分:40)

这是一篇古老的帖子,对不起,但我现在才遇到它,我想解决那些可能偶然发现这一天的人。

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

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

答案 2 :(得分:18)

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

正确的方法(假设INSERT进入一个新表)是使用table2的key字段对table1进行DELETE。

删除应该是:

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

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

答案 3 :(得分:8)

是的。首先是INSERT + SELECT,然后是DELETE 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来保留密钥。

see more on SET IDENTITY_INSERT on MSDN

答案 4 :(得分:3)

试试这个

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

然后

DELETE FROM TABLE1 WHERE Criteria

答案 5 :(得分:3)

您应该能够在INSERT语句中使用子查询。

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

然后从table1中删除。

请记住将其作为单个事务运行,以便在出现任何问题时可以回滚整个操作。

答案 6 :(得分:2)

你可以试试这个:

SELECT * INTO tbl_NewTableName 
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

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

DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

答案 7 :(得分:1)

以下是如何使用单一陈述

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

答案 8 :(得分:1)

使用这个单独的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进行适当的更改

答案 9 :(得分:1)

更清晰地表达了其他答案的暗示:

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

答案 10 :(得分:0)

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

1)在表2中插入所选记录

INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)

2)如果表2中有礼物,则从table1中删除所选记录

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

答案 11 :(得分:0)

您可以使用&#34;逻辑分区&#34; 在表格之间切换数据:

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

这是样本:

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

答案 12 :(得分:0)

它将创建一个表并将所有数据从旧表复制到新表

SELECT * INTO event_log_temp FROM event_log

您可以清除旧表数据。

DELETE FROM event_log