본문 바로가기

은비냥's Development/。MySQL,MsSQL

[MySQL] Foreign Key 설정 방법 및 옵션 설명

 

1. Foreign Key(외래키)는 DB 에서 참조 무결성을 보장하기 위해 사용된다.

  

   * 참조 무결성이란?

     자식 table 안에 1개의 필드(Columm)가 부모 table 의 필드를 참조하는 관계에서 부모 쪽 데이터의 삭제 또는

     업데이트로 인해 참조가 불가능 한 경우를 만들지 않기 위함.

 

2. Foreign Key 를 가지는 부모테이블과 자식 테이블은 Engine 이 InnoDB 여야만 한다.

 

3. Foreign Key 로 설정할 두 테이블의 필드는 같은 데이터 형을 가지고 있어야 한다.

 

4. Foreign Key 로 설정하여 참조할수 있는 값은 꼭 Primary Key 가 아니여도, Unique(인덱스) 이면

   가능하다.

 

5. Foreign Key 로  설정이 불가능한 데이터 형은 BLOB,TEXT 형이다.

 

6. Foreign Key 를 설정 할때 Constraint 는 DB 내에서 유일해야한다. (지정하지 않으면 자동으로 지정됨)

 

7. Foreign Key는 테이블 생성시 설정 또는 생성 후에 ALTER 명령어로 설정할 수 있다.

 

   sql 문 : ALTER TABLE 자식 테이블명

              ADD FOREIGN KEY (자식 테이블의 컬럼명) REFERENCES 부모 테이블명(부모 테이블의 컬럼명)

              ON UPDATE 옵션 ON DELETE 옵션;

 

8. Foreign key 옵션

 

    * 여기서 햇갈리지 말아야 할 것,!

       만약 A 테이블이 부모 테이블이고 B 테이블이 자식 테이블이라 가정하고, FK에 해당하는 필드가 A_NO와 B_NO 라

       할 때, A_NO와 B_NO의 값이 같은 데이터들에 대하여 아래에서 말하는것을 잊지말자.

     

   1) On Delete

 Cascade : 부모 데이터 삭제시 자식 데이터도 동시 삭제.

 Set null : 부모 데이터 삭제시 해당되는 자식 데이터의 Columm은  Null 로 처리.

 Set default : 부모 데이터 삭제시 자식 데이터의 Columm은 기본 값(Default) 으로 Update.

 Restrict : 자식 테이블에 데이터가 남아 있는 경우 부모 테이블의 데이터는 삭제 불가.

 No Action :  

 

  2) On Update

Cascade : 부모 데이터 수정시 자식 데이터도 동시 수정.

Set null : 부모 데이터 수정시 해당되는 자식 데이터의 Columm은 Null 로 처리.

Set default : 부모 데이터 수정시 자식 데이터의 Columm은 기본 값(Default) 으로 Update.

Restrict : 자식 테이블에 데이터가 남아 있는 경우 부모 테이블의 데이터는 수정 불가.

No Action :

  

   * No Action 속성은 설명을 찾기는 하였으나 무슨 말인지 모르겠다. 좀 더 공부해보고 적어야겠다;;;

 

NO ACTION
참조되는 측 관계변수에 대해 UPDATE, DELETE 가 실행됩니다. DBMS에서 SQL문장의 실행 종료시에 참조 정합성을 만족하는지 검사합니다. RESTRICT와 차이점은 트리거 또는 SQL문장의 시멘틱스 자체가 외래키의 제약을 채울것이라는 데에 있습니다. 이때는 SQL 문장 실행이 성공합니다. 외래 키의 제약이 만족되지 않은 경우에는 SQL문장이 실패한다.

 

 

   * On Delete 나 On Update 가 지정되어 있지 않으면 NO ACTION 이 기본 값으로 설정된다.

   * MySQL 에서는 Set Default 를 지원하지 않는다.

 

 

9. 그 밖의 참고 명령문

    1) test 테이블의 외래 키 제약을 나열시키는 명령문 :

SHOW TABLE STATUS FROM 데이터베이스명 LIKE 'test';

  

 

 

[부분 출처]  http://blog.naver.com/teastful?Redirect=Log&logNo=140113612055