본문 바로가기
SQL/기초

SQL 정리 8일차 CONSTRAINT

by 유서담 2023. 8. 27.

 Constraint (제약조건 ) 의 개념

 

- Constraint란, 데이터 무결성 유지를 위하여 사용자가 지정할 수 있는 개념

- 모든 Constraint은 데이터 사전 ( Data Dictionary )에 저장

- 의미있는 이름을 부여해야 Constraint를 참조하기 쉽게 된다

- Constraint의 이름은 표준 객체 명명법을 따르는게 좋다

- Constraint의 이름은 한 사용자 내에서 중복될 수 없다.

- Constraint의 이름을 생략했다면 ORACLE은 SYS_Cn형식의 이름을 만든다

 

 

Constraint 정의 방법

 

제약조건을 정의하는 방법에는 컬럼 레벨 ( Column Level )과 테이블 레벨 ( Table Level )의 두가지 방법

 

1. 컬럼 레벨 제약조건 - 어떤 유형의 제약조건도 정의 가능

컬럼 [CONSTRAINT 제약조건 이름] 제약조건 유형 ,

 

2. 테이블레벨 제약조건 - 어떤 제약조건도 정의 가능. ( NOT NULL제외 )

컬럼 레벨 제약과 별개이며, 여러 컬럼에 제약조건을 정의할 때 사용.

컬럼 , ...
	[CONSTRAINT 제약조건 이름] 제한조건 유형 (컬럼1, 컬럼2...)

 

Constraint 종류

제약조건 설 명
NOT NULL 컬럼이 널(NULL)값을 가질 수 없음
UNIQUE 컬럼이나 컬럼의 조합이 테이블의 모든 행에서 고유한 값을 가져야 함
PRIMARY KEY 컬럼이나 컬럼의 조합이 테이블의 각 행을 유일하게 구별시켜 줌
FOREIGN KEY 컬럼이나 컬럼의 조합이 다른 테이블의 컬럼이나 컬럼의 조합을 참조함
CHECK 컬럼값이 반드시 참이어야 하는 조건

 

NOT NULL 제약 조건

- NOT NULL 제약조건은 NULL값을 컬럼에 사용할 수 없게 한다

- NOT NULL 제약조건은 컬럼 레벨로만 정의할 수 있다 

... last_name VARCHAR2(25)
	CONSTRAINT emp_last_name_nn NOT NULL, ...

 

UNIQUE 제약 조건

- UNIQUE 제약조건은 컬럼이나 컬럼의 조합을 고유 키로 지정 ( 한 컬럼은 NULL가능)

- 컬럼 레벨이나 테이블 레벨에 모두 정의 가능

- UNIQUE컬럼에 대한 인덱스가 자동으로 생성

... reg_no VARCHAR2(13)
	CONSTRAINT emp_reg_no_uk UNIQUE, ...

 

PRIMARY KEY 제약 조건

- 테이블에 단 하나의 Primary key만 허용

- 여러 컬럼일지라도 NULL값을 허용하지 않는다

- 테이블이나 컬럼 레벨에서 정의할 수 있다

- UNIQUE 인덱스를 자동으로 생성

....id NUMBER(7)
	CONSTRAINT s_emp_id_pk PRIMARY KEY....
    
....id VARCHAR2(7),
	CONSTRAINT s_emp_id_pk PRIMARY KEY(ID),...

 

FOREIGN KEY 제약 조건

- FOREIGN KEY는 자식(Child) 테이블에 정의

- 부모(Parent) 테이블의 값과 일치하거나 NULL이어야 한다

- 테이블 레벨이나 컬럼 레벨에서 정의할 수 있다

.... dept_id NUMBER(7)
	     CONSTRAINT s_emp_dept_id_fk
             REFERENCES s_dept(id)....
         
.... dept_id NUMBER(7),
	     CONSTRAINT s_emp_dept_id_fk
             FOREIGN KEY(dept_id)
             REFERENCES s_dept(id)....

 

FOREIGN KEY 제약 조건 주의사항

 

- 참조하고자 하는 테이블이 먼저 생성되어 있어야 한다 

- 참조하고자 하는 컬럼이 PRIMARY KEY 또는 UNIQUE 제약 조건이 있어야 한다

- 참조하고자 하는 컬럼의 데이터 타입이 일치해야 한다

 

FOREIGN KEY 제약조건을 줄 때 ON DELETE CASCDE 옵션을 줄 수 있다. 참조하는 (Child) 테이블 쪽에 이 옵션을 주면 참조되는 (Parent) 테이블의 행을 삭제 가능하게 할 뿐만 아니라 참조하는 행들도 자동으로 삭제해 주는 옵션

 

 

CHECK 제약 조건

CHECK 제약 조건은 각 행이 만족해야 하는 조건을 정의

 

CHECK 제약 조건에서 사용할 수 없는 것

- CURRVAL, NEXTVAL, LEVEL, ROWNUM에 대한 참조

- SYSDATE, UID, USER, USERENV 함수에 대한 호출

- 다른 행의 값을 참조

- ORACLE Server의 예약어는 쓸 수 없다

- 컬럼이나 테이블 레벨에서 모두 정의할 수 있다

.... salary NUMBER(11,2),
	    CONSTRAINT emp_salary_ck
            CHECK(salary between 500 and 10000)..

 

데이터 조작시 Constraint의 적용

 

DML에서 데이터의 무결성을 유지하기 위하여 테이블의 정의에 기술한 Constraints의 효력이 발생한다

 

참조 무결성 제약조건 오류의 발생

- 자식(Child)테이블에 입력하려고 하는 값이 부모(Parent)테이브에 없는 경우

- 자식테이블에서 수정하려고 하는 값이 부모테이블에 없는 경우

- 부모테이블에서 삭제하려고 하는 값이 자식테이블에서 참조되는 경우

 

기타 제약조건에 위배되는 데이터를 입력, 수정, 삭제하는 경우에 제약조건 오류가 발생

'SQL > 기초' 카테고리의 다른 글

SQL 정리 10일차 DICTIONARY  (0) 2023.08.30
SQL 정리 9일차 TRANSACTION CONTROL  (0) 2023.08.29
SQL 정리 7일차 SubQUERY  (0) 2023.08.25
SQL 정리 6일차 JOIN  (0) 2023.08.16
SQL 정리 5일차 GROUP BY, HAVING  (0) 2023.08.13