제약 조건명을 명시해주지 않을 경우 ORACLE에서는 자동으로 이름을 부여
제약 조건명은 중복될 수 없으며 제약 조건명이 곧 오브젝트 이름이다
제약 조건명은 일반적으로 '테이블명_대상컬럼_제약조건 종류'를 줄여서 쓰는 것이 암묵적인 규칙
(Ex: 테이블 employees, 컬럼 last_name, 제약조건 NOT NULL => emp_ln_nn)
테이블당 한 번만 쓸 수 있는 경우 Table-Level에서 묶어줘야하고
특별한 경우가 없으면 Column-Level에서 실행한다
제약조건 조회 구문 (오브젝트명, 타입, 조건설명)
타입 코드 | 설명 |
C | Check on a table |
O | Read Only on a view |
P | Primary Key |
R | Referential AKA Foreign Key |
U | Unique Key |
V | Check Option on a view |
SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name = 'TEST2';
쿼리로 구조를 조회할 때
SELECT * FROM cols WHERE table_name = 'EMP2';
테이블은 DB에 저장될 때 무조건 대문자로 저장되기 때문에 조회할 때도 마찬가지로 대문자로 조회한다
외래키가 참조하는 제약조건명도 조회하고 싶다면 SELECT절에 'r_constraint_name' 추가하면 된다
1. NOT NULL
테이블에는 불가능하고 오로지 컬럼에만 적용 가능하며
반드시 데이터가 입력되어야만 하는 컬럼에 명시를 해두는 것이 좋다
기본 문법
CREATE TABLE 테이블명 (컬럼명 데이터타입(사이즈) 오브젝트명 NOT NULL);
2. PRIMARY KEY
'기본키'라고 많이 불리는 제약조건이며 UNIQUE + NOT NULL의 형태를 띄며
테이블당 1개의 기본키만 생성할 수 있다
여러 컬럼을 묶어 하나의 기본키로 만드는 것도 가능하다 (최대 32개)
기본키는 데이터 무결성을 지켜주는 역할을 한다
단일 기본키
CREATE TABLE test (
id NUMBER(10) CONSTRAINT t_id_pk PRIMARY KEY,
name VARCHAR2(30) CONSTRAINT t_name_pk PRIMARY KEY,
job VARCHAR2(30)
);
그룹으로 묶어 준 기본키
CREATE TABLE test (
id NUMBER(10),
name VARCHAR2(30),
job VARCHAR2(20) CONSTRAINT test_pk PRIMARY KEY(id, name)
);
3. UNIQUE
해당 컬럼에 들어가는 값이 테이블 전체에서 유일해야한다는 의미 (중복 값을 허용하지 않음)
CREATE TABLE test (
id NUMBER(10),
name VARCHAR2(30) CONSTRAINT UNIQUE NOT NULL -- NOT NULL과 함께 부여해줬음
);
4. FOREIGN KEY
'외래키'라고 많이 불리는 제약 조건이며 테이블간의 참조 데이터 무결성을 보장해준다
참조 관계가 있는 테이블의 데이터 추가, 삭제, 수정을 통제할 수 있고
아무래도 관계에 관한 제약조건이다 보니 다른 제약조건에 비해 제약사항이 있으며 아래와 같다
- 참조하는 테이블이 먼저 생성되어야 함
- 외래키가 참조하는 컬럼은 참조하는 테이블의 기본키 또는 유니크 제약조건이어야함
- 여러 컬럼을 외래키로 할 경우 참조하는 테이블의 기본키와 컬럼 개수 및 순서가 같아야 함
- 기본키와 마찬가지로 최대 32개 컬럼까지 가능
CREATE TABLE test4 (
col1 VARCHAR(10) PRIMARY KEY
);
CREATE TABLE test5 (
col4 VARCHAR(10),
col5 VARCHAR(10)
CONSTRAINT FK_example7 FOREIGN KEY(col4) REFERENCES test4(col1)
);
5. CHECK
컬럼에 입력되는 데이터를 체크하여 미리 지정된 조건에 맞을 경우에만 입력을 허용하고
그렇지 않은 경우 오류를 발생시킨다
CREATE TABLE test6 (
col1 NUMBER(10)
CONSTRAINT t6_check CHECK (col1 BETWEEN 1 AND 9)
);
'BackEnd > DataBase - Oracle' 카테고리의 다른 글
[Oracle] 데이터 정의어(DDL) (0) | 2020.02.13 |
---|---|
[Oracle] DML - 트랜잭션(Transaction) (0) | 2020.02.13 |
[Oracle] 서브 쿼리(Sub Query) (0) | 2020.02.13 |
[Oracle] JOIN과 Self-Join (0) | 2020.02.13 |
[Oracle] 그룹으로 묶는 GROUP BY절과 HAVING절 (0) | 2020.02.13 |