제약 조건 (Constraints)은 컬럼에 대한 속성 형태로 정의하지만,
엄연히 오라클 데이터베이스 객체 중 하나이며 데이터 무결성을 보장하기 위한 용도로 사용된다.
제약 조건 타입(Constraint Type)에는 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK 등이 있다.
-- 1) 컬럼별 수준제약 : 컬럼마다 제약조건 따로
-- 2) 테이블 수준제약 : 컬럼을 다 만든 후 제약 코드를 쓰는것
1) NOT NULL
컬럼을 정의할 때 NOT NULL 제약조건을 명시하면 해당 컬럼에는 반드시 데이터를 입력해야 한다.
즉 반드시 값이 들어 있어야 하는 컬럼에는 NOT NULL 제약조건을 만들어 사용한다.
컬럼명 데이터타입 NOT NULL
CREATE TABLE ex2_6 (
COL_NULL VARCHAR2(10),
COL_NOT_NULL VARCHAR2(10) NOT NULL
);
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_6';
-> EX2_6 테이블의 COL_NOT_NULL 컬럼에 부여한 NOT NULL 제약조건이
SYS_C0012413이라는 이름으로 생성되었음을 알 수 있다.
제약조건 컬럼 속성처럼 보이지만 하나의 데이터베이스 객체이므로 고유의 이름이 있다.
별도로 이름을 명시하지 않으면 오라클에서 자동으로 생성해준다.
사용자가 생성한 제약조건은 USER_CONSTRAINTS 시스템 뷰에서 확인할 수 있다.
2) UNIQUE
UNIQUE 제약조건은 말 그대로 해당 컬럼에 들어가는 값이 유일해야 한다는 의미이다. (중복값 허용X)
NULL값 사용이 가능하며, 기본키와 다르게 테이블에 여러 개 생성 가능 하다.
NULL값은 값이 없음을 의미하므로 UNIQUE 비교 대상에서 제외 된다는 점을 명시해야한다.
컬럼명 데이터타입 UNIQUE
혹은
CONSTRAINTS 제약조건명 UNIQUE(컬럼명, ...)
CREATE TABLE ex2_7 (
COL_UNIQUE_NULL VARCHAR2(10) UNIQUE, -- NULL생략(기본값 NULL) PRIMARY KEY(기본값 NOT NULL)와의 차이점
COL_UNIQUE_NNULL VARCHAR2(10) UNIQUE NOT NULL, -- 컬럼별 수준제약
COL_UNIQUE VARCHAR2(10),
CONSTRAINTS unique_nm1 UNIQUE (COL_UNIQUE) -- 테이블 수준제약
);
-- user_constraints 제약조건 시스템뷰를 통하여 생성된 제약조건 객체를 확인하는 구문
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_7';
3) PRIMARY KEY(기본키)
보통 테이블에 키를 생성했다라고 할 때 의미하는 것이 기본키이다.
기본키는 UNIQUE와 NOT NULL 속성을 동시에 가진 제약조건으로, 테이블 당 1개의 기본키만 생성할 수 있다.
컬럼명 데이터타입 PRIMARY KEY
혹은
CONSTRAINTS 제약조건명 PRIMARY KEY(컬럼명, ...)
-- 1) 단일키 : 테이블의 칼럼 1개를 대상으로 PRIMARY KEY 적용
CREATE TABLE ex2_8 (
COL1 VARCHAR2(10) PRIMARY KEY,
COL2 VARCHAR2(10)
);
-- 2) 복합키 : 테이블의 칼럼 2개 이상을 묶어서 PRIMARY KEY 적용 (테이블 수준 제약으로 묶어서 사용)
CREATE TABLE EX2_8_3(
COL1 VARCHAR2(10),
COL2 VARCHAR2(10),
COL3 VARCHAR2(10),
COL4 VARCHAR2(10),
CONSTRAINTS EE PRIMARY KEY (COL1,COL2)
);
4) FOREIGN KEY(외래키)
외래키는 테이블 간의 참조 데이터 무결성을 위한 제약조건이다.
반드시 참조하는 테이블이 먼저 생성되어 있어야 하며, 참조키가 참조 테이블의 기본키로 만들어져 있어야 한다.
외래키에 사용할 수 있는 컬럼의 개수는 최대 32개이다.
여러 컬럼을 외래키로 만들려면, 참조하는 컬럼과 외래키 컬럼의 순서와 개수는 같아야 한다. (=타입일치)
< NULL, NOT NULL 선택적 사용 가능>
CONSTRAINT 외래키명 FOREIGN KEY(컬럼명, ...)
REFERENCES 참조 테이블(참조 테이블 컬럼명, ...)
-- 기본키 테이블(먼저 생성되어야함)
CREATE TABLE parentTable(
parentPK number primary key
);
-- 참조키 테이블(기본키 테이블이 먼저 생성되고나서 생성되어야함)
CREATE TABLE childTable(
childPK number primary key,
parentID number,
foreign key (parentID) references parentTable(parentPK) -- 테이블 수준제약
);
DESC parentTable;
DESC childtable;
-- ORA-02291: 무결성 제약조건(USER01.SYS_C0011229)이 위배되었습니다- 부모 키가 없습니다
INSERT INTO CHILDTABLE VALUES(1,10);
-- 기본키 테이블 칼럼에 반드시 데이터가 존재해야한다
INSERT INTO PARENTTABLE VALUES(10);
INSERT INTO PARENTTABLE VALUES(20);
INSERT INTO PARENTTABLE VALUES(30);
INSERT INTO CHILDTABLE VALUES(1,10);
INSERT INTO CHILDTABLE VALUES(2,20);
INSERT INTO CHILDTABLE VALUES(3,30);
-- ORA-00001: 무결성 제약 조건(USER01.SYS_C0011228)에 위배됩니다
-- 40이라는 데이터가 기본키 테이블에 없기때문에
INSERT INTO CHILDTABLE VALUES(4,40);
5) CHECK
컬럼의 조건에 해당하는 데이터를 입력하고자 하는 목적으로 사용되는 제약조건이다.
컬럼에 입력되는 데이터를 체크해 특정 조건에 맞는 데이터만 입력받고, 그렇지않으면 오류를 뱉어낸다.
CONSTRAINTS 체크명 CHECK (체크조건)
CREATE TABLE ex2_9 (
num1 NUMBER
CONSTRAINTS check1 CHECK ( num1 BETWEEN 1 AND 9), -- 1~9 사이
gender VARCHAR2(10)
CONSTRAINTS check2 CHECK ( gender IN ('MALE', 'FEMALE')) -- 데이터 포함인가?
);
** DEFAULT : 기본값 표현(제약조건은 아님)
CREATE TABLE ex2_10 (
Col1 VARCHAR2(10) NOT NULL,
Col2 VARCHAR2(10) NULL,
-- 테이블에 값을 INSERT 해주지않으면 자동적으로 값을 넣어줌 <DEFAULT>
Create_date DATE DEFAULT SYSDATE -- 기본 NULL상태 -> 자동적으로 값 넣어줌
);
출처 및 참고 : https://thebook.io/006696/
'Data > Oracle' 카테고리의 다른 글
[Oracle] View(뷰) (0) | 2020.11.23 |
---|---|
[Oracle] 테이블 변경 및 테이블 복사 / ALTER TABLE / CTAS (0) | 2020.09.16 |
[Oracle] DataType / 오라클 데이터 타입의 종류 (0) | 2020.09.13 |
[Oracle] 데이터베이스 객체 (0) | 2020.09.13 |
[Oracle] 테이블 스페이스 생성 및 사용자 생성 (0) | 2020.09.13 |