Перемещение данных SQL из одной таблицы в другую
Мне было интересно, если можно переместить все строки данных из одной таблицы в другую, которые соответствуют определенному запросу?
Например, мне нужно переместить все строки таблицы из Table1 в Table2, где их имя пользователя = 'X' и пароль = 'X', чтобы они больше не отображались в Table1.
Я использую SQL Server 2008 Management Studio.
Ответы
Ответ 1
Должно быть возможно использование двух операторов в одной транзакции, вставки и удаления:
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;
DELETE FROM Table1
WHERE <condition>;
COMMIT;
Это простейшая форма. Если вам нужно беспокоиться о том, что новые сопоставимые записи вставляются в таблицу1 между двумя операторами, вы можете добавить and exists <in table2>
.
Ответ 2
Это древний пост, извините, но я только наткнулся на него сейчас, и я хотел дать свое решение тому, кто может наткнуться на этот день.
Как уже отмечалось, выполнение INSERT
, а затем DELETE
может привести к проблемам целостности, поэтому, возможно, способ обойти его и выполнить все в одном утверждении, заключается в том, чтобы воспользоваться преимуществами [deleted]
временная таблица.
DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)
Ответ 3
Все эти ответы запускают один и тот же запрос для INSERT и DELETE. Как упоминалось ранее, это приводит к тому, что DELETE собирает записи, вставленные между операторами, и может быть медленным, если запрос является сложным (хотя умные двигатели "должны" сделать второй вызов быстрым).
Правильный способ (если INSERT находится в новой таблице) заключается в том, чтобы выполнить DELETE в таблице1, используя поле ключа таблицы2.
Удалить должно быть:
DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
Извините мой синтаксис, я прыгаю между моторами, но вы поняли.
Ответ 4
Да, это так. Сначала 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
для сохранения ключа.
подробнее о SET IDENTITY_INSERT на MSDN
Ответ 5
Попробуйте это
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
Тогда
DELETE FROM TABLE1 WHERE Criteria
Ответ 6
Вы должны иметь возможность с подзапросом в инструкции INSERT.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
за которым следует удаление из таблицы 1.
Не забудьте запустить его как одну транзакцию, чтобы, если что-то пойдет не так, вы можете вернуть всю операцию назад.
Ответ 7
Вы можете попробовать следующее:
SELECT * INTO tbl_NewTableName
FROM tbl_OldTableName
WHERE [email protected]
Затем выполните простое удаление:
DELETE FROM tbl_OldTableName
WHERE [email protected]
Ответ 8
Используйте этот однострочный оператор, который безопасен без необходимости фиксации/отката с несколькими операторами.
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
Ответ 9
Вот как это сделать с помощью одного оператора
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
Ответ 10
Более четкое представление о том, на что намекают некоторые другие ответы:
DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
Ответ 11
Если две таблицы используют один и тот же идентификатор или имеют общий ключ 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)
Ответ 12
Вы можете использовать "Логическое разделение" для переключения данных между таблицами:
Обновив столбец раздела, данные будут автоматически перемещены в другую таблицу:
вот пример:
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
Ответ 13
Это создаст таблицу и скопирует все данные из старой таблицы в новую таблицу
SELECT * INTO event_log_temp FROM event_log
И вы можете очистить старые данные таблицы.
DELETE FROM event_log