: 테이블에 올바른 데이터만 입력 받고 잘못된 데이터는 들어오지 못하도록 컬럼마다 정하는 규칙
NOT NULL: NULL을 허용하지 않음
UNIQUE: 중복된 값이 입력되지 못함
PRIMARY KEY: NOT NULL + UNIQUE의 특징, 테이블당 1개만 설정 가능
FOREIGN KEY: 다른 테이블의 컬럼 참조
CHECK: 특정 값만 들어오게 허용. 나머지는 거부함
[🔎]
primary key를 제외하고는 여러 컬럼에 중복으로 제약 조건이 설정될 수 있음
CREATE TABLE new_emp1
( no NUMBER(4)
CONSTRAINT emp1_no_pk PRIMARY KEY, #1
name VARCHAR2(20)
CONSTRAINT emp1_name_nn NOT NULL,
jumin VARCHAR2(13)
CONSTRAINT emp1_jumin_nn NOT NULL
CONSTRAINT emp1_jumin_uk UNIQUE
);
#1: emp_no_pk: 제약 조건 이름 설정
➡️ 이름 설정 안하면 자동으로 지정되지만 이름 설정 해주는 것이 베스트!
Q. new_emp2 테이블의 name 컬럼에 UNIQUE 제약 조건을 추가하시오.
ALTER TABLE new_emp2
ADD CONSTRAINT emp2_name_uk UNIQUE(name);
⭐ NOT NULL 제약 조건 추가하기
Q. new_emp2 테이블의 loc_code 컬럼에 NOT NULL 제약 조건을 추가하시오.
ALTER TABLE new_emp2
ADD CONSTRAINT emp2_name_nn NOT NULL(loc_code);
ERROR at line2:
ORA-00904: :invalid identifier
-------------------------------------------------
ALTER TABLE new_emp2
MODIFY (loc_code constraint emp2_name_nn NOT NULL);
⚠️ NOT NULL 제약 조건을 추가해 줄 때는 MODIFY를 사용하자!_!
(컬럼에 기본 값으로 허용되어 있는 NULL을 NOT NULL로 변경하는 것이기 때문임)
Q. new_emp2 테이블의 no 컬럼이 emp2 테이블의 empno 컬럼의 값을 참조하도록 참조키 제약 조건을 설정하시오(new_emp2 테이블이 자식 테이블임)
ALTER TABLE new_emp2
ADD CONSTRAINT emp2_name_fk FOREIGN(no)
REFERENCES emp2(empno);
⚠️ 부모 테이블 쪽에 설정되는 컬럼이 PK 이거나 UK가 설정되어 있어야함! 아니면 오류 발생.
[🔎] 부모 테이블의 데이터를 지우고 싶은데 FK를 설정했다면?
ON DELETE CASCADE/ ON DELETE SET NULL 옵션 지정 가능
ALTER TABLE t_novalidate
DISABLE NOVALIDATE CONSTRAINT SYS_C0014418;
➡️ NOVALIDATE: CONSTRAINT가 없는 것과 동일하게 작동
(SYS_C0014418: 이건 시스템이 만들어준 이름임)
ALTER TABLE t_novalidate
DISABLE VALIDATE CONSTRAINT tv_name_nn
➡️ VALIDATE: 테이블의 내용을 변경할 수 없음
[🔎] DISABLE의 기본 옵션은 NOVALIDATE
➡️ ENABLE NOVALIDATE: 제약 조건을 ENABLE하는 시점까지 해당 테이블에 들어있는 데이터는 검사하지 않고 ENABLE한 시점 이후부터 새롭게 테이블로 입력되는 데이터만 제약 조건을 적용하여 검사하는 옵션
➡️ ENABLE VALIDATE: 제약 조건을 ENABLE하는 시점까지 테이블에 입력되어 있던 모든 데이터를 전부 검사하며 신규로 입력되는 데이터도 모두 검사하는 옵션
[🔎] ENABLE의 기본 옵션은 VALIDATE
ALTER TABLE new_emp2
DROP CONSTRAINT emp2_name_fk;