Programing

한 테이블에서 다른 테이블로 SQL 데이터 이동

crosscheck 2020. 11. 26. 07:53
반응형

한 테이블에서 다른 테이블로 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;

이것은 가장 간단한 형태입니다. 두 문 사이에 table1에 새 일치 레코드가 삽입되는 것에 대해 걱정해야하는 경우 and exists <in table2>.


이것은 오래된 게시물입니다. 죄송 합니다만 지금은 알게되었고 언젠가이 문제에 부딪 힐 수있는 사람에게 내 해결책을주고 싶었습니다.

일부가 언급했듯이 an INSERT과 a를 수행하면 DELETE무결성 문제가 발생할 수 있으므로 문제를 해결하고 단일 문에서 모든 것을 깔끔하게 수행하는 방법은 [deleted]임시 테이블 을 활용하는 것입니다 .

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

이 모든 답변은 INSERT 및 DELETE에 대해 동일한 쿼리를 실행합니다. 앞서 언급했듯이 이로 인해 DELETE가 문 사이에 삽입 된 레코드를 선택하는 위험이 있으며 쿼리가 복잡한 경우 속도가 느려질 수 있습니다 (영리한 엔진이 두 번째 호출을 빠르게 "해야합니다").

올바른 방법 (INSERT가 새 테이블에 있다고 가정)은 table2의 키 필드를 사용하여 table1에 대해 DELETE를 수행하는 것입니다.

삭제는 다음과 같아야합니다.

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

내 구문을 실례합니다. 엔진 사이를 뛰어 다니고 있지만 아이디어를 얻습니다.


네, 그렇습니다. 먼저 INSERT + SELECT 다음 원본 삭제.

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

그런 다음 원본을 삭제하십시오.

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

UserID또는 다른 기본 키 를 보존하려는 IDENTITY INSERT경우 키를 보존하는 데 사용할 수 있습니다 .

MSDN의 SET IDENTITY_INSERT에 대한 자세한 내용을 참조하십시오.


이 시도

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

그때

DELETE FROM TABLE1 WHERE Criteria

INSERT 문에서 하위 쿼리를 사용할 수 있어야합니다.

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

그다음 table1에서 삭제합니다.

문제가 발생하면 전체 작업을 롤백 할 수 있도록 단일 트랜잭션으로 실행해야합니다.


다른 답변이 암시 한 내용을 더 명확하게 표현합니다.

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

이것을 시도해 볼 수 있습니다.

SELECT * INTO tbl_NewTableName 
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

그런 다음 간단한 삭제를 실행하십시오.

DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

여러 명령문으로 커밋 / 롤백 할 필요가없는 안전한 단일 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을 적절하게 변경합니다.


단일 문으로 수행하는 방법은 다음과 같습니다.

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

"논리적 파티셔닝"사용 하여 테이블간에 데이터를 전환 할 수 있습니다 .

By updating the Partition Column, data will be automatically moved to the other table:

here is the sample:

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

If the two tables use the same ID or have a common UNIQUE key:

1) Insert the selected record in table 2

INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)

2) delete the selected record from table1 if presents in table2

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

It will create a table and copy all the data from old table to new table

SELECT * INTO event_log_temp FROM event_log

And you can clear the old table data.

DELETE FROM event_log

참고URL : https://stackoverflow.com/questions/1612267/move-sql-data-from-one-table-to-another

반응형