CREATE TABLE null_test( col1 varchar2(10) NOT NULL, col2 varchar2(10) NULL, col3 varchar2(10) );
CREATE TABLE unique_test( col1 varchar2(20) UNIQUE NOT NULL, col2 varchar2(20) UNIQUE, col3 varchar2(20) CONSTRAINT temp_unique unique(col2,col3) );
CONSTRAINT
를 사용해 TEMP_UNIQUE
라는 사용자 지정 속성을 만들었다. 이와 같은 경우에는 col2
뿐만 아니라, col2
와 col3
의 조합도 중복되어서는 안 된다.
INSERT INTO unique_test (col1,col2,col3) VALUES ('aa','bb','cc'); INSERT INTO unique_test (col1,col2,col3) VALUES ('dd','ee','cc'); // 다음과 같이 col3만 중복되는 것은 가능하나, col2와 col3의 조합은 unique해야 한다.
CREATE TABLE check_test( gender varchar2(10) NOT NULL CONSTRAINT check_gender CHECK (gender IN ('여성','남성')) ); // gender 컬럼에서 '여성','남성'이외의 값을 가질 수 없게 된다.
NOT NULL
+ UNIQUE
+ INDEX
를 전부 포함하는 조건이다. 기본키, 식별자, PK 등으로 불린다.
해당 테이블의 핵심이 되는 값을 갖는 컬럼에 지정하며, 한 테이블당 하나만 지정할 수 있다. 다만 복수의 컬럼을 기본키로 만들 수는 있다.
선언방법
- 컬럼 선언 뒤에 한 줄로 붙여서 지정하는 방법을 가장 많이 사용한다.
CREATE TABLE constTest( pkCol1 varchar2(10) PRIMARY KEY );
- 컬럼 선언 뒤에
CONSTRAINT
로 지정할 수도 있다.CREATE TABLE constTest( pkCol2 varchar2(10) CONSTRAINT pk_test1 PRIMARY KEY );
- 컬럼을 먼저 선언한 뒤 아웃라인에서 괄호로 명시해 지정하는 방법이다.
CREATE TABLE constTest( pkCol3 varchar2(10), CONSTRAINT pk_test2 PRIMARY KEY (pkCol3) );
다른 테이블의 컬럼을 참조해서 무결성을 검사하는 조건이다. 외부키, 외래키, 참조키, FK, 외부식별자 등으로 불린다.
외래키를 등록하면 참조 키를 갖는 테이블의 자식 테이블이 된다. 외래 키를 지정한 컬럼에서는 참조하는 부모 테이블의 컬럼에 포함된 값만 가질 수 있으며, 반드시 데이터 타입이 일치해야 한다. 참조되는 컬럼은 기본키나 UNIQUE
컬럼만 가능하다.
선언방법
- 인라인 선언방법
CREATE TABLE FOREIGN_KEY( DEPARTMENT_ID varchar2(10) CONSTRAINT dept_fk REFERENCES departments(department_id), NAME varchar2(10), SALARY number(10) );
- 아웃라인 선언방법
CREATE TABLE FOREIGN_KEY( DEPARTMENT_ID varchar2(10) NAME varchar2(10), SALARY number(10), CONSTRAINT dept_fk FOREIGN KEY department_id REFERENCES departments(department_id) );
부모 테이블은 자식의 데이터나 테이블 삭제에 영향을 받지 않는다.
해당 값을 참조하는 자식 테이블 데이터가 있으면 부모 테이블에서 그 값을 갖는 컬럼을 먼저 삭제할 수 없는 것이 기본이다. 외래키를 설정할 때 REFERENCES
절 뒤에 삭제 옵션을 붙여 주면 이 설정을 다르게 할 수 있다.
on delete cascade
- 참조되는 부모 테이블의 행에 대한
delete
를 허용한다.
참조되는 부모테이블 값이 삭제되면 자식테이블의 값이 함께 삭제된다.on delete set null
- 참조되는 부모테이블의 행에 대한
delete
를 허용한다.
cascade
와 달리 부모테이블의 값이 삭제되면 해당 값을 참조하는 자식테이블의 값들이null
값으로 설정된다.