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 |