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