mysql - 테이블 간에 행을 이동합니다.
구조가 동일한 테이블이 2개 있는 경우 한 테이블에서 다른 테이블로 행 세트를 이동하려면 어떻게 해야 합니까?
행 집합은 선택한 쿼리에서 결정됩니다.
예를 들어 다음과 같습니다.
customer table
person_id | person_name | person_email
123 tom tom@example.com
persons table
person_id | person_name | person_email
선택 예는 다음과 같습니다.
select * from customer_table where person_name = 'tom';
고객 테이블에서 개인 테이블로 행을 이동하고 싶다.
원래 테이블에서 데이터를 삭제하는 것이 이상적이지만, 이는 거래 위반이 되지 않습니다.
INSERT INTO persons_table SELECT * FROM customer_table WHERE person_name = 'tom';
DELETE FROM customer_table WHERE person_name = 'tom';
INSERT INTO Persons_Table (person_id, person_name,person_email)
SELECT person_id, customer_name, customer_email
FROM customer_table
WHERE "insert your where clause here";
DELETE FROM customer_table
WHERE "repeat your where clause here";
Fabio의 답변은 매우 좋지만 실행 시간이 오래 걸린다(Trilarion이 이미 썼다).
더 빠른 실행이 가능한 다른 솔루션이 있습니다.
START TRANSACTION;
set @N := (now());
INSERT INTO table2 select * from table1 where ts < date_sub(@N,INTERVAL 32 DAY);
DELETE FROM table1 WHERE ts < date_sub(@N,INTERVAL 32 DAY);
COMMIT;
@N은 처음에 타임스탬프를 취득하여 두 명령어에 모두 사용됩니다.아무도 방해하지 않도록 모든 것이 트랜잭션에 포함됩니다.
INSERT INTO Persons_Table (person_id, person_name,person_email)
SELECT person_id, customer_name, customer_email
FROM customer_table
ORDER BY `person_id` DESC LIMIT 0, 15
WHERE "insert your where clause here";
DELETE FROM customer_table
WHERE "repeat your where clause here";
ORDER BY, LIMIT 및 ASC/DESC를 사용하여 이동할 특정 열을 제한하고 선택할 수도 있습니다.
BEGIN;
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
COMMIT;
나는 같은 문제를 해결해야 했고 이것이 내가 해결책으로 사용한 것이다.
이 솔루션을 사용하려면 , 송신원테이블과 행선지테이블이 동일해야 합니다.또한 첫 번째 테이블에는 id가 일의로 자동 증분되어 있어야 합니다(같은 ID가 재사용되지 않습니다).
table1과 table2가 이 구조를 가지고 있다고 합시다.
|id|field1|field2
다음 두 가지 쿼리를 만들 수 있습니다.
INSERT INTO table2 SELECT * FROM table1 WHERE
DELETE FROM table1 WHERE table1.id in (SELECT table2.id FROM table2)
WHERE 쿼리를 사용하여 특정 레코드를 이동 및 삭제하려면
BEGIN TRANSACTION;
Insert Into A SELECT * FROM B where URL="" AND email ="" AND Annual_Sales_Vol="" And OPENED_In="" AND emp_count="" And contact_person= "" limit 0,2000;
delete from B where Id In (select Id from B where URL="" AND email ="" AND Annual_Sales_Vol="" And OPENED_In="" AND emp_count="" And contact_person= "" limit 0,2000);
commit;
이러한 두 가지 방법은 첫 번째 테이블에서 데이터를 삭제하여 한 테이블에서 다른 테이블로 데이터를 이동하는 데 적합합니다.그러나 이 경우 첫 번째 테이블의 ID auto_increment는 ID를 재배치하지 않으므로 이 경우 테이블에 수십억 개의 데이터가 있고 계속 증가하는 경우에는 적합하지 않을 수 있습니다.
데이터를 이동할 ID 범위를 제공하는 간단한 경우:
INSERT INTO old_authors SELECT * FROM authors WHERE id > 1000;
DELETE FROM authors WHERE id > 1000;
날짜 범위의 데이터를 찾으려면 다음을 수행하십시오.
INSERT INTO old_authors SELECT * FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-05-01";
DELETE FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-05-01";
또한 Transection을 사용하여 다음을 수행합니다.
START TRANSACTION;
INSERT INTO old_authors SELECT * FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-04-24";
DELETE FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-04-24";
COMMIT;
언급URL : https://stackoverflow.com/questions/19821736/mysql-move-rows-from-one-table-to-another
'programing' 카테고리의 다른 글
Linux(Mageia)의 NetBeans에서 Java 애플리케이션에서 MariaDB에 연결 (0) | 2022.12.09 |
---|---|
__proto__ JavaScript의 VS. 프로토타입 (0) | 2022.12.09 |
각각 Javascript를 중지하는 방법 (0) | 2022.12.09 |
일정 시간 후 페이지 리디렉션 PHP (0) | 2022.12.09 |
리스트에서 아이템을 랜덤으로 선택하려면 어떻게 해야 하나요? (0) | 2022.12.09 |