Database

Constraint

kmkunk 2021. 11. 1. 15:04

1. Constraint

- 데이터 무결성을 보장하기 위해 오라클에서 제공하며, 테이블의 특정 열에 지정한다.

- 데이터베이스 설계 시점, 즉 테이블을 생성할 때 주로 지정한다.

- 테이블 생성 후에도 추가, 변경, 삭제할 수 있다.

- DDL에서 활용한다.

 

1.1 Constraint 종류

종류 설명
NOT NULL - 지정한 열에 NULL을 허용하지 않는다.
- NULL을 제외한 데이터의 중복은 허용된다.
UNIQUE - 지정한 열이 중복이 아닌 유일한 값을 가져야 한다.
- NULL은 값의 중복에서 제외한다.
PRIMARY KEY - 지정한 열이 유일한 값이면서 NULL을 허용하지 않는다.
- 테이블에 하나만 지정 가능하다.
FOREIGN KEY 다른 테이블의 열을 참조하여 존재하는 값만 입력할 수 있다.
CHECK 설명한 조건식을 만족하는 데이터만 입력 가능하다.

 

1.2 Data integrity

- 데이터베이스에 저장되는 데이터의 정확성과 일관성을 보장한다는 것을 의미한다.

- 테이블 데이터의 삽입, 수정, 삭제 등 모든 과정에서 지켜야 한다.

- 종류

종류 설명
Domain integrity - 열에 저장되는 값의 적정 여부를 확인한다.
- 자료형, 적절한 형식의 데이터, NULL 여부 등과 같은 정해 놓은 범위를 만족하는 데이터임을 규정한다.
Entity integrity 테이블 데이터를 유일하게 식별할 수 있는 기본키는 반드시 값을 가지고 있어야 하며 NULL이 될 수 없고 중복될 수도 없음을 규정한다.
Referential integrity 참조 테이블의 외래키 값은 참조 테이블의 기본키로서 존재해야 하며 NULL이 가능하다.

 

2. 제약 조건 확인

- 지정한 제약 조건 정보를 확인하려면 USER_CONSTRAINTS 데이터 사전을 활용한다.

열 이름 설명
OWNER 제약 조건 소유 계정을 의미한다.
CONSTRAINT_NAME - 제약 조건 이름을 의미한다.
- 직접 지정하지 않을 경우 오라클이 자동으로 지정한다.
CONSTRAINT_TYPE - 제약 조건의 종류를 의미한다.
- C: CHECK, NOT NULL
- U: UNIQUE
- P: PRIMARY KEY
- R: FOREIGN KEY
TABLE_NAME 제약 조건을 지정한 테이블 이름을 의미한다.
/* 제약 조건 확인 예시 */
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS;

/* 제약 조건 이름 직접 지정 예시 */
CREATE TABLE TABLE_NOTNULL2 (
	LOGIN_ID VARCHAR2(20) CONSTRAINT TBLNN2_LGNID_NN NOT NULL,
	LOGIN_PWD VARCHAR2(20) CONSTRATINT TBLNN2_LGNPW_NN NOT NULL,
	TEL VARCHAR2(20)
);

/* 이미 생성한 테이블에 제약 조건 지정 예시1 : 제약 조건 추가 */
ALTER TABLE TABLE_NOTNULL
MODIFY(TELL NOT NULL);

/* 이미 생성한 테이블에 제약 조건 지정 예시2 : 제약 조건 이름 직접 지정해서 추가 */
ALTER TABLE TABLE_NOTNULL2
MODIFY(TEL CONSTRAINT TBLNN_TEL_NN NOT NULL);

/* 이미 생성한 테이블에 제약 조건 지정 예시3 : 제약 조건 이름 변경 */
ALTER TABLE TABLE_NOTNULL2
RENAME CONSTRAINT TBLNN_TEL_NN TO TBLNN2_TEL_NN;

/* 제약 조건 삭제 예시 */
ALTER TABLE TABLE_NOTNULL2
DROP CONSTRAINT TBLNN2_TEL_NN;

 

3. NOT NULL

- 즉정 열에 데이터의 중복 여부와는 상관없이 NULL의 저장을 허용하지 않는 제약 조건이다.

- 반드시 열에 값이 존재해야 하는 경우에 지정한다.

- 제약 조건을 지정한 열은 항상 해당 제약 조건을 만족해야 하므로 신규 데이터의 삽입뿐만 아니라 기존 데이터의 수정 및 삭제에도 영향을 준다.

/* NOT NULL 예시 */
CREATE TABLE TABLE_NOTNULL (
	LOGIN_ID VARCHAR2(20) NOT NULL,
	LOGIN_PWD VARCHAR2(20) NOT NULL,
	TEL VARCHAR2(20)
);

 

4. UNIQUE

- 열에 저장할 데이터의 중복을 허용하지 않고자 할 때 사용한다.

- NULL은 값이 존재하지 않음을 의미하기 때문에 중복 대상에서는 제외한다.

/* UNIQUE 예시 */
CREATE TABLE TABLE_UNIQUE (
	LOGIN_ID VARCHAR2(20) UNIQUE,
	LOGIN_PWD VARCHAR2(20) NOT NULL,
	TEL VARCHAR2(20)
);

 

5. PRIMARY KEY

- UNIQUE와 NOT NULL의 특성을 모두 가지는 제약 조건이다. 즉 데이터 중복을 허용하지 않고 NULL도 허용하지 않는다.

- 특정 열을 PK로 지정하면 해당 열에는 자동으로 인덱스가 만들어진다.

- PK로 적합한 특성을 가졌다 할지라도 주민등록번호와 같은 예민한 개인 정보를 의미하는 데이터는 PK로 지정하지 않는다.

/* PRIMARY KEY 예시 */
CREATE TABLE TABLE_PK (
	LOGIN_ID VARCHAR2(20) PRIMARY KEY,
	LOGIN_PWD VARCHAR2(20) NOT NULL,
	TEL VARCHAR2(20)
);

 

6. FOREIGN KEY

/* FOREIGN KEY 1 : 이름 지정 */
CREATE TABLE 테이블이름 (
	컬럼 자료형 CONSTRAINT [제약조건이름] REFERENCES 참조테이블(참조컬럼)
);

/* FOREIGN KEY 2 : 이름 미지정 */
CREATE TABLE 테이블이름 (
	컬럼 자료형 REFERENCES 참조테이블(참조컬럼)
);

/* FOREIGN KEY 3 : 열을 모두 정의 후 제약 조건 지정 */
CREATE TABLE 테이블이름 (
	CONSTRAINT [제약조건이름] FOREIGN KEY (컬럼)
	REFERENCES 참조테이블(참조컬럼)
);

- 서로 다른 테이블 간 관계를 정의하는데 사용하는 제약 조건이다.

- 참조 행 데이터 삭제 방법

방법 설명 및 예시
현재 삭제하려는 열 값을 참조하는 데이터 먼저 삭제 EMP_FK 테이블의 DEPTNO가 10번인 데이터를 삭제한 후 DEPT_FK 테이블의 10번 부서를 삭제한다.
현재 삭제하려는 열 값을 참조하는 데이터 수정 MP_FK 테이블의 DEPTNO가 10번인 데이터를 다른 부서 번호 또는 NULL로 변경한 후 DEPT_FK 테이블의 10번 부서를 삭제한다.
현재 삭제하려는 열을 참조하는 자식 테이블의 FK 제약 조건 해제  
제약 조건 지정 시 추가 옵션 설정 - CONSTRAINT [제약조건이름] REFERENCES 참조테이블(참조컬럼) ON DELETE CASCADE
- 열 데이터를 삭제할 때 이 데이터를 참조하고 있는 데이터도 함께 삭제한다.
- CONSTRAINT [제약조건이름] REFERENCES 참조테이블(참조컬럼) ON DELETE SET NULL
- 열 데이터를 삭제할 때 이 데이터를 참조하고 있는 데이터를 NULL로 수정한다.
/* FOREIGN KEY 예시 */
CREATE TABLE TABLE_FK (
	LOGIN_ID VARCHAR2(20) PRIMARY KEY,
	LOGIN_PWD VARCHAR2(20) NOT NULL,
	TEL VARCHAR2(20),
    DEPTNO NUMBER(2) CONSTRAINT EMPFK_DEPTNO_FK REFERENCES DEPT_FT (DEPTNO)
);

 

7. CHECK

- 열에 저장할 수 있는 값의 범위 또는 패턴을 정의할 때 사용한다.

/* CHECK 예시 */
CREATE TABLE TABLE_CHECK (
	LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK_LOGINID_PK PRIMARY KEY,
	LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLCK_LOPGINPW_CK CHECK (LENGTH(LOGIN_PWD) > 3),
	TEL VARCHAR2(20)
);

 

8. DEFAULT

- 제약 조건과는 별개로 특정 열에 저장할 값이 지정되지 않았을 경우에 기본값을 지정한다.

/* DEFAULT 예시 */
CREATE TABLE TABLE_DEFAULT (
	LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK_LOGINID_PK PRIMARY KEY,
	LOGIN_PWD VARCHAR2(20) DEFAULT '1234',
	TEL VARCHAR2(20)
);

 

9. CREATE문에서 제약 조건을 지정하는 다른 방식

종류 설명
Inline(Column-level) Constraints 제약 조건을 지정할 때 열 바로 옆에 제약 조건을 지정하는 형식을 의미한다.
Out-of-line(Table-level) Constraints - 열을 정의한 후에 별도로 제약 조건을 지정하는 형식을 의미한다.
- not null 제약 조건을 제외한 제약 조건 지정이 가능하다.
/* Inline(Column-level) Constraints 예시 */
CREATE TABLE TABLE_NAME (
	COL1 VARCHAR2(20) CONSTRAINT CONSTRAINT_NAME PRIMARY KEY,
	COL2 VARCHAR2(20) NOT NULL,
	COL3 VARCHAR2(20)
);

/* Out-of-line(Table-level) Constraints 예시 */
CREATE TABLE TABLE_NAME (
	COL1 VARCHAR2(20),
	COL2 VARCHAR2(20),
	COL3 VARCHAR2(20),
	PRIMARY KEY (COL1),
	CONSTRAINT CONSTRAINT_NAME UNIQUE (COL2)
);

 

10. 제약 조건 비활성화, 활성화

- 여러 필요에 의해 제약 조건을 비활성화하거나 비활성화되어 있는 제약 조건을 다시 활성화할 수 있다.

/* 제약 조건 비활성화 */
ALTER TABLE 테이블이름
DISABLE [NOVALIDATE / VALIDATE(선택)] CONSTRAINT 제약조건이름;

/* 제약 조건 활성화 */
ALTER TABLE 테이블이름
ENABLE [NOVALIDATE / VALIDATE(선택)] CONSTRAINT 제약조건이름;

 

참고

- 『오라클로 배우는 데이터베이스 입문』