테이블 간에 SQL 데이터 이동
특정 쿼리와 일치하는 모든 데이터 행을 한 테이블에서 다른 테이블로 이동할 수 있는지 궁금합니다.
예를 들어 모든 테이블 행을 표 1에서 표 2로 이동하여 사용자 이름 = 'X' 및 암호 = 'X'를 사용하여 표 1에 더 이상 표시되지 않도록 해야 합니다.
SQL Server 2008 Management Studio를 사용하고 있습니다.
한 트랜잭션 내에 삽입 및 삭제라는 두 개의 문을 사용할 수 있어야 합니다.
BEGIN TRANSACTION;
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;
DELETE FROM Table1
WHERE <condition>;
COMMIT;
이것이 가장 간단한 형태입니다.두 문 사이에 일치하는 새 레코드가 표 1에 삽입되는 것을 걱정해야 하는 경우, 다음을 추가할 수 있습니다.and exists <in table2>
.
이것은 오래된 게시물입니다. 죄송하지만, 저는 지금에서야 발견했습니다. 그리고 저는 언젠가 이것을 우연히 발견할 수 있는 사람에게 제 해결책을 주고 싶었습니다.
몇몇 사람들이 언급했듯이, 수행하는 것은INSERT
그 다음에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)
실례합니다. 엔진 사이로 뛰어내리려고 하는데 잘 아시네요.
일부 다른 답변이 시사하는 바를 보다 명확하게 보여줍니다.
DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
네.먼저 INSERT + SELECT를 선택한 다음 Original을 삭제합니다.
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
키를 보존합니다.
SET Identity에 대한 자세한 정보_MSDN에 삽입
INSERT 문에 하위 쿼리를 사용하여 할 수 있어야 합니다.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
다음으로 표 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 서버에서 작동 MySql에 대해 적절한 변경 수행
사용해 보세요.
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
그리고나서
DELETE FROM TABLE1 WHERE Criteria
사용해 볼 수 있습니다.
SELECT * INTO tbl_NewTableName
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
그런 다음 단순 삭제를 실행합니다.
DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
"논리 파티션"을 사용하여 테이블 간에 데이터를 전환할 수 있습니다.
파티션 열을 업데이트하면 데이터가 자동으로 다른 테이블로 이동됩니다.
다음은 샘플입니다.
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
단일 문을 사용하는 방법은 다음과 같습니다.
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
두 테이블이 동일한 ID를 사용하거나 공통 고유 키를 가지고 있는 경우:
표 2에 선택한 레코드 삽입
INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)
표 2에 있는 경우 표 1에서 선택한 레코드 삭제
DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND (A.ID = B.ID)
테이블을 만들고 이전 테이블의 모든 데이터를 새 테이블로 복사합니다.
SELECT * INTO event_log_temp FROM event_log
이전 테이블 데이터를 지울 수 있습니다.
DELETE FROM event_log
일부 시나리오에서는 표 1을 스크립팅하고 기존 표 1의 이름을 표 2로 변경한 후 스크립트를 실행하여 표 1을 재생성하는 것이 가장 쉬울 수 있습니다.
언급URL : https://stackoverflow.com/questions/1612267/move-sql-data-from-one-table-to-another
'it-source' 카테고리의 다른 글
Powershell의 Git 분기에 대한 탭 완료 추가 (0) | 2023.05.01 |
---|---|
SQL Server 테이블의 기본 키를 어떻게 나열합니까? (0) | 2023.05.01 |
Range 개체가 지정된 경우 셀 범위의 각 셀을 반복합니다. (0) | 2023.05.01 |
디렉토리의 모든 파일 및 폴더를 삭제하는 방법은 무엇입니까? (0) | 2023.05.01 |
어떻게 하면 맥에 파이썬의 pip3를 설치할 수 있습니까? (0) | 2023.05.01 |