sub_title
 MSSQL
제   목 MSSQL 참조키(Foreign Key) 설정하기
작성자 다자래 등록일 2008-06-21 16:53:52 조회수 69,681

[MSSQL 참조키(Foreign Key) 설정하기]

참조키(외래키)는 데이타의 참조 무결성을 유지하기 위한 필수 조건으로 아래와 같은 특성을 가집니다.

참조키의 특성
1. 참조되는 테이블의 PRIMARY KEY나 UNIQUE 제약 또는 UNIQUE INDEX가 지정된 컬럼만을 참조할 수 있습니다.
2. 참조키를 만들어도 자동적으로 색인이 만들어 지지 않습니다. 색인이 필요하면 직접만들어 써야
   하며, 조인에 참여하는 참조키는 쿼리 속도를 고려한다면 색인을 만들어 두는것이 좋습니다.
3. 참조키는 참조되는 테이블의 여러 컬럼을 참조할 수 있습니다. 간단히 말하면 참조되는 테이블에서 여러 컬럼이
   모인 복합키(COMPOSITE KEY)가 사용되고 이를 참조한다면 너무나 당연한 것이겠죠?
4. 참조키가 설정되면 실수로 데이타를 삭제하거나 변경하는 것을 방지할 수 있습니다.

참조키를 정의하는 기본형식은 아래와 같습니다.

[CONSTRAINT constraint_name]
    [FOREIGN KEY] [(column[,...n])]
    REFERENCES ref_table [(ref_column[,...n])]
    [ON DELETE { CASCADE | NO ACTION } ]
    [ON UPDATE { CASCADE | NO ACTION } ]

constraint_name : 제약조건의 이름으로 데이타베이스 내에서 유일해야 합니다.
ref_table : 참조되는 테이블 이름입니다.
ref_column : 참조되는 컬럼또는 컬럼들입니다.

NO ACTION : 참조되는 테이블의 행이 삭제 또는 수정되었을 경우 SQLServer에서는 오류 메시지를 띄우고, 해당 작업은
                      롤백(RollBack)됩니다.
CASCADE : 참조되는 테이블의 행이 삭제 또는 수정되었을 경우 이를 참조하는 테이블에서 자동으로 변경되도록 설정
                   하는 옵션입니다. 옵션을 지정하지 않으면 디폴트는 NO ACTION 입니다.


그럼 위의 기본형식을 이용하여 실제 테이블을 만들어 보겠습니다.

--참조되는 테이블 Customer
CREATE TABLE Customer
(
   cus_id VARCHAR(12) NOT NULL PRIMARY KEY,
   cus_name VARCHAR(20) NOT NULL,
   cus_tel VARCHAR(14) NOT NULL,
   cus_zip VARCHAR(6) NOT NULL,
   cus_addr VARCHAR(50) NOT NULL,
   cus_idate DATETIME NOT NULL
);

--참조하는 테이블
CREATE TABLE Customer_Order
(
   order_num INT NOT NULL PRIMARY KEY,
   order_name VARCHAR(50) NOT NULL,
   order_idate DATETIME NOT NULL,
   cus_id VARCHAR(12) NOT NULL,
   constraint FK_cusid_customer FOREIGN KEY ( cus_id ) REFERENCES Customer ( cus_id )
);

위의 CREATE 명령어는 참조되는 테이블인 Customer 테이블의 PRIMARY KEY인 cus_id 를 참조하여
참조하는 테이블인 Customer_Order의 cus_id를 참조키로 설정하고 있습니다. 위와 같이 제약조건 명을 안주고
아래와 같이 좀더 간단한 방법으로도 참조키를 설정할 수 있습니다.

--참조되는 테이블 Customer
CREATE TABLE Customer
(
   cus_id VARCHAR(12) NOT NULL PRIMARY KEY,
   cus_name VARCHAR(20) NOT NULL,
   cus_tel VARCHAR(14) NOT NULL,
   cus_zip VARCHAR(6) NOT NULL,
   cus_addr VARCHAR(50) NOT NULL,
   cus_idate DATETIME NOT NULL
);

--참조하는 테이블
CREATE TABLE Customer_Order
(
   order_num INT NOT NULL PRIMARY KEY,
   order_name VARCHAR(50) NOT NULL,
   order_idate DATETIME NOT NULL,
   cus_id VARCHAR(12) NOT NULL REFERENCES Customer (cus_id)
);

위의 명령대로 테이블을 만들고 Enterprise Manager를 열어서 새 데이타베이스 다이어그램을 실행하고, 만들어진 두 테이블을 추가해 보면 제약조건의 이름을 DBMS가 자동으로 생성해 줬다는 것을 확인 할 수 있습니다.

위에서 설명한 CASCADE 와 NO ACTION 옵션은 아래와 같이 설정합니다.

--참조하는 테이블
CREATE TABLE Customer_Order
(
   order_num INT NOT NULL PRIMARY KEY,
   order_name VARCHAR(50) NOT NULL,
   order_idate DATETIME NOT NULL,
   cus_id VARCHAR(12) NOT NULL,
   constraint FK_cusid_customer FOREIGN KEY ( cus_id ) REFERENCES    Customer ( cus_id )
   ON UPDATE CASCADE
   ON DELETE NO ACTION

);

테이블 생성중에 참조키 설정을 하지않고, 나중에 필요하게 되었을때는 다음과 같이 ALTER TABLE 문을 이용해서 참조키를 설정할 수 있습니다.

ALTER TABLE Customer_Order
ADD CONSTRAINT FK_custid_customer FOREIGN KEY ( cus_id ) REFERENCES Customer ( cus_id )


작성자: 다자래(mfcchang@naver.com)
웹제작 토탈 커뮤니티 http://www.webmadang.net
 
7
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
9  [MSSQL] 기본키 제약조건의 삭제   member 수확물 0 / 0 29234 2008-07-31
8  SQL 테이블간의 차집합, 교집합 구하기   member 수확물 0 / 0 31606 2008-07-31
7  MSSQL - Outer Join 의 사용   member 다자래 0 / 0 38917 2008-07-30
6  MSSQL - Inner Join 의 사용   member 다자래 3 / 0 35732 2008-07-26
5  MSSQL - text, ntext 길이(바이트) 구하기   member 다자래 3 / 1 42538 2008-07-21
4  MSSQL - GROUP BY 를 이용한 중복 데이타 삭제 이미지   member 다자래 10 / 0 66948 2008-07-14
3  MSSQL - GROUP BY 를 이용한 중복 데이타 체크 이미지   member 다자래 16 / 4 96397 2008-07-12
2  MSSQL 뷰(VIEW) 사용하기 - 기초   member 다자래 8 / 1 54278 2008-07-09
1  MSSQL 참조키(Foreign Key) 설정하기   member 다자래 7 / 0 69681 2008-06-21
write
button [1]