MSSQL Foreign Key

MS-SQL 2011. 1. 18. 08:27

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

 참조키의 특성

 1. 참조되는 테이블의 IMARY 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 : 참조되는 테이블의 행이 삭제 또는 수정되었을 경우 SQL Server에서는 오류 메세지를 띄우고, 해당 작업은 롤백(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

);

 

-- 참조하는 테이블

 Customer_Order

(

      order_num INT NOT NULL PRIMARY KEY,

      order_name VARCHAR(50) NOT NULL,

      order_idate DATETIME NOT NULL,

      constraint FK_cusid_customer FOREIGN KEY (cus_id) REFERENCES Customer (cus_id)

);

위의 CREATE 명령어는 참조되는 테이블의 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

);

 

-- 참조하는 테이블

 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 옵션은 아래와 같이 설정합니다.

 

 -- 참조하는 테이블 Customer_Order

(

      order_num INT NOT NULL PRIMARY KEY,

      order_name VARCHAR(50) NOT NULL,

      order_idate DATETIME 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_cutomer FOREIGN KEY (cus_id REFERENCDES Customer (cus_id)

'MS-SQL' 카테고리의 다른 글

저장 프로시져(stored procedure)  (0) 2011.01.18
Posted by zany2974
,