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 외부 키 오류에 대한 자세한 설명을 얻을 수 있습니다.