Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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