14.6.6 InnoDB 및 FOREIGN KEY 제약
이 섹션에서는 InnoDB 스토리지 엔진의 외부 키 처리와 MySQL 서버에서의 처리와 비교했을 때의 차이점에 대해 설명합니다.
외부 키 정의
InnoDB
테이블의 외부 키 정의는 다음과 같은 조건이 적용됩니다.
InnoDB
는 외래 키가 어떤 인덱스 컬럼 또는 컬럼의 그룹을 참조하는 것이 허가됩니다. 그러나 참조되는 테이블은 참조되는 컬럼이 동일한 순서로 첫 번째 컬럼으로 나열되어있는 인덱스가 존재해야합니다.현재
InnoDB
는 사용자 정의 파티션이있는 테이블의 외부 키가 지원되지 않습니다. 즉, 사용자가 파티션 된InnoDB
테이블에 외래 키가 참조하는 외래 키 참조 또는 컬럼이 포함될 가능성이 없습니다.InnoDB
는 외래 키 제약 조건이 고유하지 않은 키를 참조하는 것이 허용됩니다. 이것은 표준 SQL의InnoDB
확장입니다.
참조 액션
InnoDB
테이블의 외부 키에 대한 참조 작업은 다음과 같은 조건이 적용됩니다.
SET DEFAULT
는 MySQL 서버에서 허용되어 있지만,InnoDB
는 무효로 거부됩니다. 이 어구를 사용하여CREATE TABLE
및ALTER TABLE
문은 InnoDB 테이블에서 허용되지 않습니다.동일한 참조 키 값을 가진 여러 행이 부모 테이블에있는 경우,
InnoDB
는 동일한 키 값을 가진 다른 부모 행이 존재하지 않는 것처럼 외부 키 체크로 작동합니다. 예를 들어,RESTRICT
형식 제약 조건이 정의되어 여러 부모 행을 포함하는 자식 행이 존재하는 경우에는 이러한 부모의 라인 중 하나를 제거 할 수InnoDB
에서 허용되지 않습니다.InnoDB
는 외래 키 제약 조건에 대응하는 인덱스의 레코드에 따라 깊이 우선 알고리즘을 사용하여 계단식 작업이 수행됩니다.ON UPDATE CASCADE
또는ON UPDATE SET NULL
은 계단식 중에 이전에 업데이트하고 동일한 테이블을 업데이트하도록 재귀 경우RESTRICT
처럼 작동합니다. 즉, 자기 참조 형ON UPDATE CASCADE
또는ON UPDATE SET NULL
작업은 사용할 수 없습니다. 이 목적은 계단식 업데이트에서 발생하는 무한 루프를 방지하는 것입니다. 반대로, 자체 참조ON DELETE SET NULL
은 자체 참조ON DELETE CASCADE
처럼 작동 할 수 있습니다. 케스케이드는 15 수준보다 깊게 중첩 될 수 없습니다.일반적인 MySQL과 마찬가지로 다수의 행을 삽입, 삭제 또는 업데이트하는 SQL 문은
InnoDB
에 의해UNIQUE
및FOREIGN KEY
제약이 한줄 씩 체크됩니다. 외부 키 체크를 실행할 때,InnoDB
는 조사 대상의 자식 또는 부모 레코드에 공유 행 레벨 락을 설정합니다.InnoDB
는 즉시 외부 키 제약 조건을 검사하고 그 검사는 트랜잭션의 커밋까지 지연되지 않습니다. SQL 표준에 따르면, 기본 동작은 지연 검사해야합니다. 즉, 전체 SQL 문이 처리 된 후에 비로소 제약 조건을 검사합니다.InnoDB
에서 제약 지연 확인이 구현 될 때까지 외부 키를 사용하여 그 자체를 참조하는 레코드를 삭제하는 등의 일부 작업을 수행 할 수 없습니다.
외부 키 사용법 및 오류 정보
외부 키와 그 사용법에 대한 일반적인 정보는 INFORMATION_SCHEMA.KEY_COLUMN_USAGE
테이블에서 쿼리를 실행하여 얻을 수 있습니다. InnoDB
테이블에 관련된 자세한 정보는 INNODB_SYS_FOREIGN
및 INNODB_SYS_FOREIGN_COLS
테이블 또는 INFORMATION_SCHEMA
데이터베이스에서 찾을 수 있습니다. 섹션 13.1.17.2 "외래 키 제약 조건 사용" 을 참조하십시오.
SHOW ERRORS
이외에도 InnoDB
테이블이 참여하는 외부 키 오류 (일반적으로 MySQL 서버에서는 오류 150)가 발생할 때, SHOW ENGINE INNODB STATUS
의 출력을 확인하는 것으로, 최근의 InnoDB
외부 키 오류에 대한 자세한 설명을 얻을 수 있습니다.