2011-09-14 3 views
2

하나의 SQL 문에서 다음을 처리하려고합니다. 레코드 수를 아카이브 테이블에 복사하고 주 테이블에서 기존 레코드를 즉시 제거하고 싶습니다. 표. 같은MySQL - 다른 테이블에 레코드를 복사하고 기존 레코드를 제거하십시오.

뭔가 :

INSERT INTO `table_archive` 
SELECT * FROM `table_main` 
WHERE `id` IN (1, 2, 3, 4) 
REMOVE FROM `table_main` WHERE `id` IN (1, 2, 3, 4) 

그것은 기본적으로 다른 한 테이블에서 레코드를 절단 및 붙여 넣기 같다.

분명히 위의 문장은 내가 성취하고자하는 것입니다. 성취가 가능하고 SQL 문이 무엇 이겠는가?

+1

단지 하나 개의 쿼리와 함께 할 수 없습니다. – zerkms

+0

예 - 그건 내가 생각한 것입니다.하지만 적어도 하나의 명령문을 사용하여 IN 범위의 레코드를 삽입 할 수 있습니까? – user398341

답변

3

여러 DML 명령을 사용할 필요가 언급 한 바와 같이 :

START TRANSACTION; 
INSERT INTO `table_archive` SELECT * FROM `table_main` WHERE `id` IN (1, 2, 3, 4); 
DELETE`table_main` WHERE `id` IN (1, 2, 3, 4); 
COMMIT; 

참조 : http://dev.mysql.com/doc/refman/5.0/en/commit.html

+0

감사합니다. Kevin - 내 질문에 대한 답변이라고 생각합니다. – user398341

1

아니요, 단일 쿼리에서이 작업을 수행 할 수 없습니다. 그러나 트랜잭션 내에서이를 수행하려고 시도 할 수 있으므로 단일 쿼리로 처리됩니다. 모든 것이 성공하거나 전혀 일어나지 않습니다.

이것은 테이블이 InnoDB 유형이라고 가정합니다. MyISAM은 트랜잭션을 지원하지 않습니다.

+0

예 - 그들 사이에 관계가 없으므로 MyISAM입니다. 따라서 InnoDB가 필요하지 않습니다. – user398341

+0

그러면 두 개의 별도 쿼리로 처리해야하며 그 사이에 아무 것도 나지 않기를 바랍니다. InnoDB는 외래 키만을위한 것이 아닙니다. FK 없이도 완벽하게 작동합니다. 거래를 사용할 수 있다는 것은 전환에 대한 중요한 보너스입니다. "잃는"유일한 것은 전문 텍스트 인덱스입니다. –

+0

Marc - InnoDB도 MyISAM보다 조금 느리지 않습니까? 또한 이전에는 트랜잭션을 사용하지 않았습니다. 테이블과 상호 작용할 때마다 자동으로 실행됩니까? 아니면 특정 진술을 사용하여 트리거해야합니까? 그리고 또한 - 데이터베이스 구조를 내보낼 때 - 또한 내보내거나 구조와 함께 SQL을 가져온 후에 다시 정의해야합니까? – user398341

1

전혀 가능하지 않습니다. 별도의 DELETE를 수행하고 전체 트랜잭션을 래핑하십시오 (트랜잭션을 지원하는 언어를 사용하는 경우 MYSQL 콘솔과는 달리 트랜잭션을 지원하지 않습니다).

관련 문제