CHECK
기본키( Primary key ) - PK
외래키( Foreign key ) - FK
-- UNIQUE
CREATE TABLE UNIQUE_TEST2(
col1 varchar2(20),
col2 varchar2(20),
CONSTRAINTS temp_unique2 UNIQUE(col1, col2)
);
SELECT * FROM UNIQUE_TEST2 ;
INSERT INTO UNIQUE_TEST2 (col1, col2)
VALUES ('aa', 'bb') ;
INSERT INTO UNIQUE_TEST2 (col1, col2)
VALUES ('aa', 'cc') ;
INSERT INTO UNIQUE_TEST2 (col1, col2)
VALUES ('aa', 'dd') ;
INSERT INTO UNIQUE_TEST2 (col1, col2)
VALUES ('aa', 'ee') ;
-- check : 주어진 값만 허용하는 조건
CREATE TABLE check_test(
gender varchar2(10) NOT NULL
CONSTRAINTS check_gender CHECK (gender IN('남성', '여성'))
) ;
SELECT * FROM CHECK_TEST ;
INSERT INTO CHECK_TEST VALUES ('남성') ;
INSERT INTO CHECK_TEST VALUES ('M') ;
UNIQUE와 CHECK의 사용
- 기본키 역시 기본적인 제약 조건들을 테이블을 생성할 때 같이 정의한다.
- 테이블 당 하나만 정의 가능하다. (두 개 이상의 PK는 조합키 / 복합키 라고 불린다.
묶어서 하나로 본다.)
- PK는 NOT NULL + UNIQUE의 기능을 가지고 있다.
- 자동으로 INDEX가 생성이 되는데, 이는 검색 키로써 검색 속도를 향상시킨다.
- 주키 / 기본키 / 식별자 / PK 등으로 불리고 있다.
CREATE TABLE testTable(
col1 varchar2(10) primary key,
col2 varchar2(10) constraint PK제약조건이름 primary key,
col3 varchar2(10),
constraint PK제약조건이름 primary key(col3)
) ;
alter table 테이블명 add constraint 제약조건명 primary key(컬럼명) ;
-- PK
-- 인라인 방식
CREATE TABLE primary_key(
student_id number(10) PRIMARY KEY ,
name varchar2(20)
);
-- 아웃라인 방식
CREATE TABLE PRIMARY_KEY2(
student_id number(10),
name varchar2(20),
CONSTRAINTS student_pk PRIMARY KEY(student_id)
);
-- 테이블 생성 후 기본키를 생성하는 방법
CREATE TABLE PRIMARY_KEY3(
student_id number(10),
name varchar2(20)
);
ALTER TABLE PRIMARY_KEY3
ADD CONSTRAINTS student_pk3 PRIMARY KEY(student_id) ;
- 외부키 / 외래키 / 참조키 / 외부 식별자 / FK로 불린다.
- FK가 정의된 테이블은 자식 테이블이라 칭한다.
- 참조되는 테이블, 즉 PK가 존재하는 테이블을 부모 테이블이라 한다.
- 부모테이블의 PK컬럼에 존재하는 데이터만 자식테이블에 입력할 수 있다.
- 부모테이블은 자식의 데이터나 테이블이 삭제된다고 영향을 받지 않는다.
- 참조하는 데이터 컬럼과 데이터 타입이 반드시 일치해야 한다.
- 참조할 수 있는 컬럼은 기본키(PK)이거나, UNIQUE만 가능하다. (보통 PK랑 엮는다)
-- 테이블 생성 시 설정
CREATE TABLE pTable(
pPK number(10) primary key
);
CREATE TABLE cTable(
pPK number(10),
Col1 varchar2(10),
CONSTRAINTS fk_code foreign key( pPK )
references pTable( pPK ) on delete cascade
);
CONSTRAINTS [제약조건명] foreign key( [컬럼명] )
references [참조할 테이블 이름]( [참조할 컬럼] )
[ on delete cascade || on delete set null ]
-- 테이블 생성 후 설정
ALTER TABLE [테이블명]
ADD CONSTRAINTS [외래키 이름] FOREIGN KEY([참조컬럼])
REFERENCES [참조 테이블명]( [참조컬럼] ) ;
- on delete cascade
-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
즉, 참조되는 부모 테이블 값이 삭제되면 연쇄적으로 자식 테이블의 값 또한 삭제된다.
- on delete set null
-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
이건 cascade와 다르게 부모 값이 삭제되면 해당 삭제된 값들을 참조하는
자식 테이블의 값들이 NULL 값으로 설정된다.
-- FK
-- 테이블 생성과 외래키 지정 동시
CREATE TABLE foreign_key(
department_id number(4),
CONSTRAINTS dept_fk FOREIGN KEY (department_id)
REFERENCES DEPARTMENTS (department_id)
);
-- 테이블 생성하고 난 후 외래키를 지정하는 방법
CREATE TABLE foreign_key2(
department_id number(4)
);
ALTER TABLE FOREIGN_KEY2
ADD CONSTRAINTS dept_fk2 FOREIGN KEY (department_id)
REFERENCES departments (department_id)
;
CREATE TABLE daddy(
idx NUMBER(10),
mID NUMBER(10) PRIMARY KEY
);
-- daughter
CREATE TABLE daughter(
idx number(10) PRIMARY KEY,
mID number(10),
CONSTRAINTS FK_DA FOREIGN KEY (mID)
REFERENCES daddy (mID) ON DELETE CASCADE
);
INSERT INTO daddy VALUES (1, 10);
INSERT INTO daddy VALUES (2, 20);
INSERT INTO daddy VALUES (3, 30);
SELECT * FROM DADDY d ;
INSERT INTO daughter VALUES (100, 10);
INSERT INTO daughter VALUES (101, 10);
INSERT INTO daughter VALUES (102, 20);
SELECT * FROM DAUGHTER d ;
INSERT INTO daughter VALUES (103, 30);
DELETE DADDY WHERE idx = 2;
-- daughter2
CREATE TABLE daughter2(
idx number(10) PRIMARY KEY,
mID number(10),
CONSTRAINTS FK_DA2 FOREIGN KEY (mID)
REFERENCES daddy (mID) ON DELETE SET NULL
) ;
INSERT INTO daughter2 VALUES (100, 10);
INSERT INTO daughter2 VALUES (101, 10);
INSERT INTO daughter2 VALUES (103, 30);
SELECT * FROM daughter2 ;
DELETE DADDY WHERE idx = 1 ;