1. 무결성 제약 조건
테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 테이블을 생성할 때 각 컬럼에 대해서 정의하는 여러가지 규칙
NOT NULL : NULL을 허용하지 않는다.
UNIQUE : 중복된 값을 허용하지 않고 항상 유일한 값을 갖도록 한다.
PRIMARY KEY : NULL을 허용하지 않고 중복값 허용하지 않는다. (NOT NULL + UNIQUE 조건)
FOREIGN KEY : 참조되는 테이블의 컬럼 값이 존재하면 허용. 2개 테이블의 관계
CHECK : 저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMP';
-- 딕셔너리에서 EMP 테이블의 CONTSRAINT를 확인
CONSTRAINT_TYPE
P : PRIMARY KEY
R : FOREIGN KEY
U : UNIQUE
C : CHECK. NOT NULL
SELECT CONSTRAINT_NAME, COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'EMP';
2. 무결성 제약 조건 넣기 (컬럼 레벨)
[CONSTRAINT constraint_name] constraint_type(column_name)
CONSTRAINT 지침
- 제약조건에 이름을 지정하지 않으면 Oracle server가 SYS_Cn의 형식으로 자동으로 이름을 생성.
- 제약조건은 크게 테이블 레벨과 열 레벨(컬럼 레벨)로 정의
CREATE TABLE EXAMPLE(
ID NUMBER(6),
NAME VARCHAR2(20) [CONSTRAINT NAME_CTR] NOT NULL,
----> 컬럼 레벨(제약조건 이름을 생략하면 시스템이 자동으로 이름 생성
CONSTRAINT EXAMPLE_ID_PK PRIMARY KEY(ID));
----> 테이블 레벨(제약조건 이름이 EXAMPLE_ID_PK로 생성)
1) NOT NULL 지정
CREATE TABLE EMP02(
EMPNO NUMBER(4) NOT NULL, -- 시스템이 자동으로 제약조건 이름 생성
ENAME VARCHAR2(10) CONSTRAINT EMP04_ENAME_NN NOT NULL, -- 제약조건 이름 지정
JOB VARCHAR2(9),
DEPTNO NUMBER(2)
);
-- INSERT 할 때 EMPNO, ENAME을 입력하지 않으면 에러가 난다. (NULL값을 넣을 수 없다.)
-- CONSTRAINT EMP04_ENAME_NN 은 제약조건의 이름을 직접 넣은 것
-- 제약조건의 이름을 쓰지 않으면 시스템이 자동으로 SYS_Cn 형식으로 자동으로 이름을 생성한다.
2) UNIQUE 지정 (중복값 불가)
CREATE TABLE EMP04(
EMPNO NUMBER(4) CONSTRAINT EMP04_EMPNO_UK UNIQUE,
ENAME VARCHAR2(10) CONSTRAINT EMP04_ENAME_NN NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(2)
);
-- INSERT시 EMPNO가 똑같은 것을 또 넣을 수 없게 된다.
3) PRIMARY KEY 지정 (NOT NULL + 중복값 불가)
CREATE TABLE EMP05(
EMPNO NUMBER(4) CONSTRAINT EMP05_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT EMP05_ENAME_NN NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(2)
);
-- INSERT시 EMPNO에 NULL값도 못넣고, 중복값도 넣을 수 없다.
4) FOREIGN KEY 지정 (2개 테이블의 관계)
CREATE TABLE EMP06(
EMPNO NUMBER(4) CONSTRAINT EMP06_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT EMP06_ENAME_NN NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(2) CONSTRAINT EMP06_DEPTNO_FK REFERENCES DEPT(DEPTNO)
);
-- DEPTNO를 DEPT 테이블의 DEPTNO를 레퍼런스(참조)로 삼는 FOREIGN KEY로 설정.
INSERT INTO EMP06
VALUES (7499, 'ALLEN', 'SALESMAN', 30);
-- 부모테이블인 DEPT 테이블에 30이라는 DEPTNO가 있으므로 INSERT 가능
INSERT INTO EMP06
VALUES (7499, 'ALLEN', 'SALESMAN', 50);
-- 부모테이블인 DEPT 테이블에 50이라는 DEPTNO가 없으므로 에러가 난다.
5) CHECK
CREATE TABLE EMP07(
SAL NUMBER(7, 2) CONSTRAINT EMP07_SAL_CH CHECK(SAL BETWEEN 500 AND 5000);
GENDER VARCHAR2(1) CONSTRAINT EMP07_GENDER_CH CHECK(GENDER IN('M', 'F'));
-- SAL에는 500에서 5000사이의 값만 넣도록 지정
-- GENDER에는 M이나 F 중 하나의 문자만 넣도록 지정
6) DEFAULT
CRETE TABLE EMP07(
LOC VARCHAR2(13) DEFAULT 'SEOUL'
-- 값을 별도로 지정하지 않으면 NULL이 아니라 DEFAULT로 설정된 값(SEOUL)이 들어감.
테이블 레벨 제약 조건 지정은 컬럼을 모두 정의 후 테이블 정의를 마무리 짓기 전에 따로 생성된 컬럼들에 대한 제약 조건을 한꺼번에 지정하는 것을 말한다.
- 제약 조건 하단에 넣기 (테이블 레벨 제약 조건)
CREATE TABLE EMP01(
EMPNO NUMBER(4),
DEPTNO NUMBER(4),
...
FOREIGN KEY(DEPTNO REFERENCES DPT(DEPTNO)
);
-- 제약조건을 아래에 따로 넣어줄 수도 있다.
4. 테이블 레벨 제약 조건 추가 (ADD)
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name] constraint_type(column_name);
ALTER TABLE EMP01 ADD CONSTRAINT EMP01_EMPNO_PK PRIMARY KEY(EMPNO)
5. 테이블 레벨 제약 조건 삭제 (DROP)
ALTER TABLE table_name
DROP [CONSTRAINT constraint_name];
ALTER TABLE EMP01
DROP CONSTRAINT EMP01_EMPNO_PK;
6. 제약조건 비활성화 / 활성화 (DISABLE / ENABLE)
DISABLE CONSTRAINT : 제약 조건의 일시 비활성화
ENABLE CONSTRAINT : 비활성화된 제약 조건을 해제하여 다시 활성화
disable된 제약조건을 enable시키기 위해서는 PRIMARY KEY를 enable시킨 후, FOREIGN KEY를 enable 시켜야 한다.
7. CASCADE 옵션
부모 테이블과 자식 테이블 간에 참조 설정이 되어있을 때 부모 테이블의 제약 조건을 비활성화 시키면서 이를 참조하고 있는 자식 테이블의 제약조건까지 함께 비활성화 시킬 수 있다.
DROP PRIMARY KEY CASCADE;
-- CASCADE 옵션을 붙이면 삭제가 가능해진다.
'오라클 기초' 카테고리의 다른 글
가상 테이블 뷰(VIEW) (0) | 2016.01.19 |
---|---|
Oracle SQL Developer에서 ERD 만들기 (1) | 2016.01.18 |
서브쿼리: 다중행 서브쿼리와 IN, ANY, ALL 연산자 (0) | 2016.01.14 |
조인: Cross, Equi , Non-Equi , Outer , Self , ANSI Join (0) | 2016.01.14 |
SQL 그룹함수: 그룹함수의 종류, GOUP BY, HAVING절 (0) | 2016.01.14 |