13.2.5.1 INSERT ... SELECT 구문
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] [(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
INSERT ... SELECT
를 사용하면 하나 또는 다수의 테이블에서 많은 행을 테이블에 빠르게 삽입 할 수 있습니다. 예 :
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id> 100;
INSERT ... SELECT
문에는 다음 조건이 적용됩니다.
중복 키 위반의 원인이되는 행을 무시하려면
IGNORE
를 지정합니다.DELAYED
는INSERT ... SELECT
는 무시됩니다.INSERT
문의 대상 테이블이 쿼리의SELECT
부분의FROM
절에 나타나도 괜찮습니다. (이것은 일부 이전 버전의 MySQL에서는 불가능했습니다.) 그러나 테이블에 삽입하고, 하위 쿼리 같은 테이블에서 선택 할 수 없습니다.테이블에서 선택과 테이블에 삽입을 동시에 할 경우, MySQL은
SELECT
에서 행을 유지하기 위해 임시 테이블을 생성하고 그 행을 목표 테이블에 삽입합니다. 그러나TEMPORARY
테이블을 동일한 명령문에서 두 번 참조 할 수 없기 때문에t
가TEMPORARY
테이블의 경우INSERT INTO t ... SELECT ... FROM t
을 사용할 수없는 점은 계속 남아 있습니다 ( 섹션 B.5.7 .2 "TEMPORARY 테이블 문제" 를 참조하십시오).AUTO_INCREMENT
컬럼은 정상적으로 작동합니다.바이너리 로그를 사용하여 원래의 테이블을 확실히 재 작성할 수 있도록하기 위해, MySQL은
INSERT ... SELECT
문에서 병렬 삽입이 허용되지 않습니다.SELECT
와INSERT
가 같은 테이블을 참조하는 경우 모호한 컬럼 참조 문제를 해결하려면SELECT
부분에서 사용되는 각 테이블의 고유 한 별칭을 지정하고 해당 부분에있는 컬럼 이름을 적절 별칭으로 한정합니다.
MySQL 5.6.2에서 테이블의 이름을 따르는 PARTITION
옵션에서 소스 또는 대상 테이블 (또는 둘 다) 목의 파티션 또는 서브 파티션 (또는 둘 다)을 사용할지 여부를 명시 적으로 선택할 수 있습니다. PARTITION
이 문 SELECT
부분에있는 소스 테이블의 이름과 함께 사용되는 경우 해당 파티션 목록에 지정된 파티션 또는 서브 파티션의 행만 선택됩니다. PARTITION
이 문 INSERT
부분 대상 테이블의 이름과 함께 사용되는 경우는 선택된 모든 행을이 옵션 다음에 나오는 파티션 목록에 지정된 파티션 또는 서브 파티션에 삽입 할 수 있어야합니다. 그렇지 않은 경우, INSERT ... SELECT
문은 실패합니다. 자세한 내용 및 예제는 섹션 19.5 "파티션 선택" 을 참조하십시오.
ON DUPLICATE KEY UPDATE
값의 부분에서는 SELECT
부분에서 GROUP BY
를 사용하지 않는 한, 다른 테이블의 컬럼을 참조 할 수 있습니다. 하나의 부작용으로 값 부분에있는 고유하지 않은 컬럼 이름을 규정해야 할 점이 있습니다.
ORDER BY
절이없는 SELECT
문이 행을 반환 순서는 특정되지 않습니다. 즉, 복제를 사용하는 경우 이러한 SELECT
가 마스터와 슬레이브에서 행을 같은 순서로 반환 보장은 없습니다. 따라서 마스터와 슬레이브 사이에 불일치가 발생할 수 있습니다. 이것이 발생하지 않도록하기 위해 복제 된 INSERT ... SELECT
문은 항상 INSERT ... SELECT ... ORDER BY
으로 설명하도록하십시오. column
column
의 선택은 마스터와 슬레이브에서 확실히 행이 동일한 순서로 반환 한 문제가되지 않습니다. 섹션 17.4.1.16 "복제 및 LIMIT" 도 참조하십시오.
이 문제 때문에, MySQL 5.6.4에서 INSERT ... SELECT ON DUPLICATE KEY UPDATE
및 INSERT IGNORE ... SELECT
문에는 문 기반 복제는 안전하지 않은 플래그가 지정됩니다. 이러한 변경으로 인해 이러한 문은 명령문 기반 모드를 사용하는 경우에는 로그에 경고를 생성하고 MIXED
모드를 사용하는 경우 행 기반 형식을 사용하여 기록됩니다. (Bug # 11758262, Bug # 50439)
섹션 17.1.2.1 "문 기반 및 열 기반 리플리케이션의 장점과 단점" 을 참조하십시오.
MySQL 5.6.6 이전에는 테이블 수준의 잠금을 채용 한 MyISAM
등의 스토리지 엔진을 사용하여 파티션 된 테이블에서 작동하는 INSERT ... SELECT
문을 사용하여 소스 및 대상 테이블의 모든 파티션이 잠겨있었습니다. (이것은 행 레벨 락을 채용 한 InnoDB
등의 스토리지 엔진을 사용하는 테이블에서는 발생하지 않았고 현재도 발생하지 않습니다.) MySQL 5.6.6 이후에서는 대상 테이블의 모든 파티션이 잠금 하지만 소스 테이블은 실제로 읽은 파티션 만 고정됩니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.