✍ 데이터베이스의 무결성을 유지하기 위해 테이블의 데이터에 대해 적용되는 규칙. 제약조건을 사용하면 데이터의 유효성, 일관성, 정확성을 보장할 수 있으며 이러한 제약조건은 데이터 입력 및 수정 시 데이터를 검사하여 불필요한 값이 들어가는 것을 방지한다.
| 종류 | 설명 |
|---|---|
| PRIMARY KEY | UNIQUE + NOT NULL 의 결합과 같음. 기본키는 그 데이터 행을 대표하는 컬럼으로서의 역할을 수행하여 다른 테이블에서 외래키들이 참조할 수 있는 키로서의 자격을 가지고 있다. 기본키를 정의하면 자동으로 인덱스를 생성, 그 이름은 기본 키 제약조건의 이름과 같다. |
| UNIQUE KEY | 데이터의 유일성을 보장(=> 중복되는 데이터가 존재할 수 없음)하고, 자동으로 인덱스가 생성. NULL 허용, 하나의 테이블에 여러 개 생성 가능. |
| FOREIGN KEY | 기본키를 참조하는 컬럼 or 컬럼들의 집합, 외래키를 가지는 컬럼의 데이터 형은 외래키가 참조하는 기본키의 컬럼과 데이터 형이 일치해야 한다. |
| CHECK | 컬럼의 값을 어떤 특정 범위로 제한 |
| NOT NULL | NOT NULL 제약조건 설정 시 해당 컬럼에는 꼭 데이터를 입력해야 함. |
✍ 사용자가 사용할 수 있는 제약조건이나 테이블이 소유하고 있는 제약조건을 확인할 수 있다.
-- 제약 조건 조회
SELECT * FROM USER_CONSTRAINTS;
-- 테이블 제약조건 조회
SELECT * FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES';
✍ 열 레벨 제약조건은 특정 컬럼에 대해 직접 정의되는 제약조건이다. 각 컬럼의 제약조건은 해당 컬럼 선언과 함께 지정되며, 이러한 제약조건은 해당 컬럼에 국한되어 적용되며, 일반적으로 단순한 제약조건을 설정할 때 사용됩니다.
CREATE TABLE EMP4 (
EMPNO NUMBER(4) CONSTRAINT EMP4_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR(10) NOT NULL,
SAL NUMBER(7,2) CONSTRAINT EMP4_SAL_CK CHECK (SAL <= 10000),
DEPTNO NUMBER(2) CONSTRAINT EMP4_DEPTNO_DEPT_DEPTID_FK
REFERENCES DEPARTMENTS(DEPARTMENT_ID)
);
-- 구조만 확인 가능, 제약조건 확인 불가능
DESC EMP4;
-- 테이블 제약조건을 확인하려면 다음과 같은 구문을 사용
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMP4';
✍ 테이블 레벨 제약조건은 테이블의 여러 컬럼에 적용될 수 있는 제약조건을 정의하는 방식. 이러한 제약조건은 테이블 정의의 끝 부분에 위치하며, 주로 복합 키 또는 복잡한 제약조건을 지정할 때 사용된다.
CREATE TABLE EMP5 (
EMPNO NUMBER(4),
ENAME VARCHAR2(10) NOT NULL, -- NOT NULL은 테이블 제약조건을 설정x, 무조건 열 레벨로 가능하다.
SAL NUMBER(7,2),
DEPTNO NUMBER(2),
CONSTRAINT EMP5_EMPNO_PK PRIMARY KEY (EMPNO),
CONSTRAINT EMP5_SAL_CK CHECK (SAL <= 10000),
CONSTRAINT EMP5_DEPTNO_DEPTID_FK
FOREIGN KEY (DEPTNO) REFERENCES DEPARTMENTS(DEPARTMENT_ID)
);
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMP5';
✍ 제약조건 관리는 데이터베이스 테이블의 무결성을 유지하기 위해 제약조건을 정의하고, 추가하고, 수정하고, 삭제하고, 상태를 변경하는 작업을 포함한다. 이를 통해 데이터베이스가 일관성과 정확성을 유지하도록 보장하며 Oracle에서는 SQL 명령어와 데이터 딕셔너리 뷰를 사용하여 제약조건을 관리할 수 있습니다.
CREATE TABLE DEPTS(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13),
CONSTRAINT DEPTS_DNAME_UK UNIQUE(DNAME),
CONSTRAINT DEPTS_DEPTNO_PK PRIMARY KEY(DEPTNO)
);
-- 제약조건 관리 = ALTER로 추가, 삭제가 가능, 수정은 불가능하다.
CREATE TABLE EMPS(
EMPNO NUMBER(4),
ENAME VARCHAR2(10) NOT NULL,
JOB VARCHAR2(9),
MGR NUMBER(4),
HIRE_DATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) NOT NULL,
CONSTRAINT EMPS_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMPS_DEPTS_DEPTNO_FK FOREIGN KEY(DEPTNO)
REFERENCES DEPTS(DEPTNO)
);
ALTER TABLE EMPS
ADD CONSTRAINT EMPS_MGR_FK FOREIGN KEY(MGR) REFERENCES EMPS(EMPNO);
-- FOREIGN KEY 제약 조건 EMPS_MGR_FK이 생긴 것을 볼 수 있다.
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMPS';
-- PRIMARY KEY EMPNO를 참조하는 제약조건(EMPS_MGR_FK)이 있어서 삭제가 불가능
ALTER TABLE EMPS DROP PRIMARY KEY;
-- EMPS_MGR_FK 제약조건 삭제
ALTER TABLE EMPS
DROP CONSTRAINT EMPS_MGR_FK;
-- 참조하는 제약조건을 삭제하고 실행하니 삭제가 가능
ALTER TABLE EMPS DROP PRIMARY KEY;
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMPS';
-- CASCADE 제약조건을 무시하고 삭제
ALTER TABLE DEPTS DROP PRIMARY KEY CASCADE;
| 키워드 | 설명 |
|---|---|
| DISABLE VALIDATE | 테이블의 데이터를 수정(INSERT, UPDATE, DELETE)하지 못하도록 합니다. |
| DISABLE NOVALIDATE | DEFAULT, 해당 열의 제약조건만 사용하지 않도록 한다. |
| ENABLE VALIDATE | DEFAULT, 이미 저장되어 있었던 데이터도 제약조건을 체크한다. 만일 만족하지 못하면 제약조건을 활성화 하지 못한다. |
| ENABLE NOVALIDATE | 이미 저장되어 있었던 데이터는 제약조건을 체크하지 않는다. |
✍ 제약조건의 활성화와 비활성화는 데이터베이스에서 특정 제약조건의 적용을 일시적으로 중지하거나 다시 활성화하는 작업을 의미한다. 이 기능은 데이터베이스 관리와 데이터 작업 시 매우 유용하며, 데이터 무결성을 유지하면서도 특정 상황에서 유연성을 제공할 수 있습니다.
-- 제약조건 비활성화
-- 10000원 이상을 삽입하지 못하는 CHECK 제약조건 삭제
ALTER TABLE EMP4 DISABLE CONSTRAINT EMP4_SAL_CK;
-- 급여를 20000원 INSERT문 에러 없이 삽입
INSERT INTO EMP4 VALUES (9999, 'KING', 20000, 10);
-- 제약조건 활성화
-- 20000원이 들어간 행 때문에 제약조건 활성화가 되지 않는다.
ALTER TABLE EMP4 ENABLE CONSTRAINT EMP4_SAL_CK;
-- 기존 존재하는 행들을 제외하고 그 다음부터 제약조건 활성화
ALTER TABLE EMP4 ENABLE NOVALIDATE CONSTRAINT EMP4_SAL_CK;
SELECT * FROM EMP4;
https://inpa.tistory.com/
인프런 오라클 데이터베이스