한 테이블에서 다른 테이블로 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
'Programing' 카테고리의 다른 글
지연으로 관찰 가능 항목을 생성하려면 어떻게해야합니까? (0) | 2020.11.26 |
---|---|
Angular 4+ : 경로로 수동 리디렉션 (0) | 2020.11.26 |
사파리 및 크롬 자바 스크립트 콘솔 여러 줄 (0) | 2020.11.26 |
유효성 검사 오류 : "유형 : java.lang.Integer에 대한 유효성 검사기를 찾을 수 없습니다." (0) | 2020.11.26 |
Jenkins에서 일정은 어떻게 구축됩니까? (0) | 2020.11.26 |