다음과 같은 경우 오류 150을 방지하려면 다음 조건을 충족해야 합니다. ALTER TABLE ADD FOREIGN KEY
외래 키를 참조하기 위해 정의하려면 상위 테이블이 있어야 합니다. 올바른 순서(상위 테이블 먼저, 하위 테이블 순)로 테이블을 정의해야 합니다. 두 테이블이 서로 참조하는 경우 FK 제약 조건 없이 하나의 테이블을 생성한 다음 두 번째 테이블을 생성하고 ALTER TABLE을 사용하여 첫 번째 테이블에 FK 제약 조건을 추가해야 합니다.
두 테이블 모두 외래 키 제약 조건, 즉
을 지원해야 합니다. 다른 스토리지 엔진은 외래 키 정의를 자동으로 무시하므로 오류나 경고를 반환하지 않지만 FK 제약 조건을 저장하지 않습니다. ENGINE=InnoDB
상위 테이블에서 참조되는 열은 키의 가장 왼쪽 열이어야 합니다. 부모의 키가
인 경우 가장 좋습니다. PRIMARY KEY 或 UNIQUE KEY
FK 정의는 PK 정의와 동일한 순서로 PK 열을 참조해야 합니다. 예를 들어 FK
순서가 열에 상위 PK를 정의하는 경우입니다. REFERENCES Parent(a,b,c),则不得按 (a,c,b)
상위 테이블의 PK 열은 하위 테이블의 FK 열과 동일한 데이터 유형을 가져야 합니다. 예를 들어 상위 테이블의 PK 열이
인 경우입니다. UNSIGNED,请务必为子表字段中的相应列定义 UNSIGNED
예외: 문자열의 길이는 다를 수 있습니다. 예를 들어
와 그 반대의 경우도 마찬가지입니다. VARCHAR(10) 可以引用 VARCHAR(20)
문자열 유형의 모든 FK 열은 해당 PK 열과 동일한 문자 세트 및 데이터 정렬을 가져야 합니다.
하위 테이블에 이미 데이터가 있는 경우 FK 열의 각 값은 상위 테이블의 PK 열에 있는 값과 일치해야 합니다. 다음과 같은 쿼리를 사용하여 이를 확인하세요.
으아악
일치하지 않는 값 0을 반환해야 합니다. 분명히 이 쿼리는 일반적인 예이므로 테이블 및 열 이름을 바꿔야 합니다.
상위 테이블이나 하위 테이블 모두
테이블이 될 수 없습니다. TEMPORARY
상위 테이블이나 하위 테이블 모두 PARTITIONED 테이블이 될 수 없습니다.
옵션을 사용하여 FK를 선언하는 경우 FK 열은 null을 허용해야 합니다. ON DELETE SET NULL
외래 키에 대한 제약 조건 이름을 선언하는 경우 제약 조건 이름은 제약 조건이 정의된 테이블 내뿐만 아니라 전체 스키마에서 고유해야 합니다. 두 테이블은 동일한 이름을 가진 자체 제약 조건을 가질 수 없습니다.
새 FK를 만들려는 동일한 필드를 가리키는 다른 FK가 다른 테이블에 있고 형식이 잘못된 경우(예: 다른 데이터 정렬) 먼저 일관성을 유지해야 합니다. 이는
이 일관되지 않은 관계로 잘못 정의된 과거 변경 때문일 수 있습니다. 이러한 문제가 있는 FK를 식별하는 방법에 대한 지침은 아래 @andrewdotn의 답변을 참조하세요. SET FOREIGN_KEY_CHECKS = 0;
다음과 같은 경우 오류 150을 방지하려면 다음 조건을 충족해야 합니다.
ALTER TABLE ADD FOREIGN KEY
을 지원해야 합니다. 다른 스토리지 엔진은 외래 키 정의를 자동으로 무시하므로 오류나 경고를 반환하지 않지만 FK 제약 조건을 저장하지 않습니다.
ENGINE=InnoDB
인 경우 가장 좋습니다.
PRIMARY KEY
或UNIQUE KEY
순서가 열에 상위 PK를 정의하는 경우입니다.
REFERENCES Parent(a,b,c)
,则不得按(a,c,b)
인 경우입니다.
예외: 문자열의 길이는 다를 수 있습니다. 예를 들어UNSIGNED
,请务必为子表字段中的相应列定义UNSIGNED
와 그 반대의 경우도 마찬가지입니다.
VARCHAR(10)
可以引用VARCHAR(20)
으아악
일치하지 않는 값 0을 반환해야 합니다. 분명히 이 쿼리는 일반적인 예이므로 테이블 및 열 이름을 바꿔야 합니다.테이블이 될 수 없습니다.
TEMPORARY
옵션을 사용하여 FK를 선언하는 경우 FK 열은 null을 허용해야 합니다.
ON DELETE SET NULL
이 일관되지 않은 관계로 잘못 정의된 과거 변경 때문일 수 있습니다. 이러한 문제가 있는 FK를 식별하는 방법에 대한 지침은 아래 @andrewdotn의 답변을 참조하세요.
SET FOREIGN_KEY_CHECKS = 0;