데이터베이스/Oracle
무결성 제약 조건 (NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK)
챈박
2021. 4. 28. 13:19
무결성 제약 조건 |
역 할 |
NOT NULL |
NULL을 허용하지 않는다. |
UNIQUE |
중복된 값을 허용하지 않는다. 항상 유일한 값을 갖도록 한다. |
PRIMARY KEY |
NULL을 허용하지 않고 중복된 값을 허용하지 않는다. NOT NULL 조건과 UNIQUE 조건을 결합한 형태이다. |
FOREIGN KEY |
참조되는 테이블의 칼럼의 값이 존재하면 허용한다. |
CHECK |
저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용한다. |
FOREIGN KEY
CREATE TABLE EMP03(
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);
참조하기 위해서는 상위 테이블의 해당 컬림이 기본키로 지정되어 있어야 하위 테이블에서 외래키로 참조할 수 있음
CHECK 제약조건
CREATE TABLE EMP06(
EMPNO NUMBER(4) PRIMARY KEY,
ENAME VARCHAR2(10) NOT NULL,
GENDER VARCHAR2(1) CHECK (GENDER IN('M', 'F'))
);
컬럼레벨 방식으로 제약조건 지정하기
CREATE TABLE EMP05(
EMPNO NUMBER(4) CONSTRAINT EMP05_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT EMP05_ENAME_NN NOT NULL,
JOB VARCHAR2(9) CONSTRAINT EMP05_JOB_UK UNIQUE,
DEPTNO NUMBER(4) CONSTRAINT EMP05_DEPTNO_FK REFERENCES DEPT(DEPTNO)
);
테이블 레벨 방식으로 제약조건 지정하기
(PRIMARY KEY 같은 경우 중복으로 지정할 수 있는데 이렇게 중복으로 정의하려면 테이블 레벨 방식으로 지정해야한다)
▶복합키 지정
CREATE TABLE MEMBER01(
NAME VARCHAR2(10),
ADDRESS VARCHAR2(30),
HPHONE VARCHAR2(16),
CONSTRAINT MEMBER01_COMBO_PK PRIMARY KEY(NAME, HPHONE)
);
▶ 컬럼 레벨과 테이블 레벨 방식 둘다 사용하여 제약조건 지정
CREATE TABLE EMP03(
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);
NOT NULL 은 컬럼레벨만 가능한 것 같음..
제약조건 추가하는 방법
ALTER TABLE DEPT03
ADD CONSTRAINT DEPT03_DEPTNO_PK PRIMARY KEY (DEPTNO);
ALTER TABLE EMP01
ADD CONSTRAINT EMP01_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO);
제약조건 제거하는 방법
ALTER TABLE EMP05
DROP CONSTRAINT EMP05_EMPNO_PK;
제약조건 확인하기
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP03';
CONSTRAINT_NAME CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------
EMP03_ENAME_NN C
EMP03
"ENAME" IS NOT NULL
EMP03_EMPNO_PK P
EMP03
CONSTRAINT_NAME CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------
EMP03_JOB_UK U
EMP03
EMP03_DEPTNO_FK R
EMP03
CONSTRAINT_NAME CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------
C -> NOT NULL이나 CHECK 제약이 걸려있음 (DESC 테이블명으로 구조파악 하면 NULL 여부가 나오므로 구분 가능 )
P -> PRIMARY KEY
U -> UNIQUE
R -> REFERENCES
(SELECT 문에 R_CONSTRAINT_NAME 를 추가하면 참조관계 확인 가능)
CASCADE
DROP TABLE DEPT01 CASCADE CONSTRAINTS;
CASCADE를 이용해서 참조(REFERENCES)받는(상위 테이블) 테이블이어도 제거 가능
(하위테이블은 DROP으로 바로 제거 가능)
반응형