Перемещение данных SQL из одной таблицы в другую

Мне было интересно, можно ли переместить все строки данных из одной таблицы в другую, соответствующие определенному запросу?

Например, мне нужно переместить все строки таблицы из таблицы 1 в таблицу2, где их имя пользователя = 'X' и пароль = 'X', чтобы они больше не отображались в таблице 1.

Я использую SQL Server 2008 Management Studio.

Спасибо.

Должно быть возможно использование двух операторов в одной транзакции, вставки и удаления:

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

Это простейшая форма. Если вам нужно беспокоиться о том, что новые сопоставимые записи вставляются в таблицу1 между двумя операторами, вы можете добавить a and exists <in table2> .

Это древний пост, извините, но я только наткнулся на него сейчас, и я хотел дать свое решение тому, кто мог бы наткнуться на этот день.

Как уже упоминалось, выполнение INSERT а затем DELETE может привести к проблемам с целостностью, поэтому, возможно, способ обойти его и выполнить все в одном из утверждений – использовать временную таблицу [deleted] .

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

Все эти ответы выполняют один и тот же запрос для INSERT и DELETE. Как упоминалось ранее, это связано с тем, что DELETE собирает записи, вставленные между операторами, и может быть медленным, если запрос является сложным (хотя умные двигатели «должны» сделать второй вызов быстрым).

Правильный способ (если INSERT находится в свежей таблице) состоит в том, чтобы выполнить DELETE в таблице1, используя поле ключа таблицы2.

Удалить должно быть:

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

Извините мой синтаксис, я прыгаю между двигателями, но вы получаете идею.

Да. Сначала 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' 

вы можете сохранить пользовательский или другой первичный ключ, тогда вы можете использовать IDENTITY INSERT для сохранения ключа.

подробнее о SET IDENTITY_INSERT на MSDN

Вы должны иметь возможность с подзапросом в инструкции INSERT.

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

за которым следует удаление из таблицы 1.

Не забудьте запустить его как одну транзакцию, чтобы, если что-то пойдет не так, вы можете перевернуть всю операцию назад.

Попробуй это

 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 [email protected] 

Затем выполните простое удаление:

 DELETE FROM tbl_OldTableName WHERE [email protected] 

Если две таблицы используют один и тот же идентификатор или имеют общий ключ UNIQUE:

1) Вставьте выбранную запись в таблицу 2

 INSERT INTO table2 SELECT * FROM table1 WHERE (conditions) 

2) удалить выбранную запись из таблицы 1, если она представлена ​​в таблице 2

 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-сервере делают соответствующие изменения для MySql

Давайте будем гением компьютера.