[DataBase] 7장_ 제약 조건

존진·2023년 10월 27일

📌 제약 조건

: 테이블에 올바른 데이터만 입력 받고 잘못된 데이터는 들어오지 못하도록 컬럼마다 정하는 규칙

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 옵션 지정 가능

  • ON DELETE CASCADE: 부모 테이블의 데이터가 지워지면 자식 테이블의 데이터도 함께 지워라
  • ON DELETE SET NULL: 부모 테이블의 데이터가 지워질 경우 자식 테이블의 값을 NULL로 설정해라

✅ 제약 조건 관리하기(제약 조건을 껐다 켰다 가능하다?!)

🔹제약 조건 DISABLE 하기

  • NOVALIDATE, VALIDATE
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 하기

➡️ ENABLE NOVALIDATE: 제약 조건을 ENABLE하는 시점까지 해당 테이블에 들어있는 데이터는 검사하지 않고 ENABLE한 시점 이후부터 새롭게 테이블로 입력되는 데이터만 제약 조건을 적용하여 검사하는 옵션

➡️ ENABLE VALIDATE: 제약 조건을 ENABLE하는 시점까지 테이블에 입력되어 있던 모든 데이터를 전부 검사하며 신규로 입력되는 데이터도 모두 검사하는 옵션

[🔎] ENABLE의 기본 옵션은 VALIDATE

🔹제약 조건 삭제하기

ALTER TABLE new_emp2
DROP CONSTRAINT emp2_name_fk;

0개의 댓글