Foreign 키 정의문은 아래의 조건에 달려 있다:

  • 양쪽의 테이블은 모두 InnoDB 테이블이어야 하고 TEMPORARY 테이블이 아니어야 한다.
  • 레퍼런스 테이블에서는, foreign 키 컬럼이 동일한 순서로 처음 컬럼에 리스트되어 있는 곳에 인덱스가 존재해야 한다그와 같은 인덱스가 존재하지 않으면레퍼런싱 테이블에 자동으로 생성이 된다.
  • 레퍼런스 테이블에서는레퍼런스 컬럼이 동일한 순서로 첫 번째 컬럼에 리스트되어 있는 곳에 인덱스가 존재해야 한다.
  • foreign 키 컬럼상의 인덱스 프리픽스는 지원되지 않는다이것의 한 가지 시퀀스는BLOB 및 TEXT 컬럼이 foreign 키에는 포함될 수 없다는 것이며그 이유는 이러한 컬럼에 있는 인덱스는 항상 프리픽스 길이를 포함해야 하기 때문이다.
  • 만일 CONSTRAINT symbol 구문이 주어진다면symbol 값은 데이터 베이스안에서 유니크 해야 한다만일 그 구문이 주어지지 않는다면InnoDB는 그 이름을 자동으로 생성한다.

    • CASCADE부모 테이블에서 열을 삭제 또는 업데이트하고 차일드 테이블에서 매칭 열을 자동으로 삭제 또는 업데이트 한다ON DELETE CASCADE 및 ON UPDATE CASCADE는 모두 지원된다두 테이블간에는부모 테이블 또는 차일드 테이블에 있는 동일한 컬럼에서 작용하는 ON UPDATE CASCADE 구문을 정의하지 말아야 한다.
    • SET NULL부모 테이블에서 열을 삭제 또는 업데이트하고 foreign 키 컬럼 또는 차일드 테이블에 있는 컬럼을 NULL로 설정한다이것은 foreign 키 컬럼이 NOT NULL 수식어를 가지고 있는 않을 경우에만 유효하다ON DELETE SET NULL 및 ON UPDATE SET NULL 구문은 모두 지원된다.
    • NO ACTION표준 SQL에서는NO ACTION 은 말 그대로 프라이머리 키 값을 삭제 또는 업데이트하려는 시도가 레퍼런스 테이블에 관련된 foreign 키 값이 존재할 경우에는 허용되지 않는다는 것을 의미한다InnoDB는 부모 테이블에 대한 삭제 또는 업데이트 연산을 거부한다.
    • RESTRICT부모 테이블에 대한 업데이트 또는 삭제 연산을 거부한다 (Reject). NO ACTION 및 RESTRICT는 ON DELETE 또는 ON UPDATE 구문을 생략한 것과 같은 것이다. (어떤 데이터베이스 시스템은 검사 연기 (deferred check)를 가지고 있는데,NO ACTION이 검사 연기이다. MySQL의 경우, FOREIGN 키 제한은 즉시 검사를 진행하기 때문에NO ACTION 및 RESTRICT는 동일한 것이 된다.)
    • SET DEFAULT이 동작은 파서에 의해 인식되지만InnoDB는 ON DELETE SET DEFAULT 또는 ON UPDATE SET DEFAULT 구문을 가지고 있는 테이블 정의문을 거부한다.


해당 컬럼이 key(인덱스) 로 되어 있어야 한다.


alter table [자식테이블명] add constraint FOREIGN key ([자식컬럼명]) REFERENCES [부모테이블명] ([부모컬럼명]);

맨뒤에 [on delete, on update] 문을 추가해서 RESTRICT, CASCADE, NO ACTION, SET NULL 옵션을 줄 수 있다.


alter table user_book_category_rtb add constraint FOREIGN key (no_category) REFERENCES user_category (no) on delete CASCADE;



http://jmnote.com/wiki/MySQL_%EC%99%B8%EB%9E%98%ED%82%A4_%EC%98%B5%EC%85%98_%EB%B3%80%EA%B2%BD