Constraint
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 제약조건이름;
참고
- 『오라클로 배우는 데이터베이스 입문』