- 하나의 테이블에 하나만 존재하며 각 행을 식별하기 위한 용도로 사용
- NULL값을 허용하지 않고 중복값을 허용안함(NOT NULL + UNIQUE KEY)
- 부모테이블의 특정 컬럼(기본키)를 참조하는 컬럼
- 부모테이블에 참조하는 값이 없으면 오류가 발생한다.
- 컬럼의 모든 값이 유일해야 하는 경우에 사용. 중복데이터를 허용하지 않음
- NULL은 허용됨
- 조건에 맞는 데이터만 입력되도록 조건을 부여하는 제약조건
- NULL값을 허용하지 않는 컬럼에 설정
예1) 제약조건에 이름을 부여하지 않은 경우
CREATE TABLE DEPT1
(
DEPTNO NUMBER(2) PRIMARY KEY,
DNAME VARCHAR2(15),
LOC CHAR(9) CHECK(LOC IN('서울','부산'))
);
SELECT * FROM USER_CONSTRAINTS; -- 데이터딕셔너리
SELECT TABLE_NAME,CONSTRAINT_NAME FROM USER_CONSTRAINTS;
INSERT INTO DEPT1 VALUES(10,'영업부','서울');
SQL> INSERT INTO DEPT1 VALUES(11,'인사부','제주');
-- 체크제약조건이 맞지 않음
INSERT INTO DEPT1 VALUES(11,'인사부','제주')
*
1행에 오류:
ORA-02290: 체크 제약조건(C##SCOTT.SYS_C0011265)이 위배되었습니다
예2) 제약조건에 이름을 부여하기 - 컬럼레벨과 테이블레벨이 있다.
-- 컬럼레벨
CREATE TABLE DEPT2
(
DEPTNO NUMBER(2) CONSTRAINT PK_DEPT2_DEPTNO PRIMARY KEY,
DNAME VARCHAR2(15) DEFAULT '개발부',
LOC VARCHAR2(15)
);
-- 테이블레벨
CREATE TABLE EMP2
(
EMPNO NUMBER(4),
ENAME VARCHAR2(15) CONSTRAINT NN_NAME NOT NULL,
DEPTNO NUMBER(2),
CONSTRAINT PK_EMP2_EMPNO PRIMARY KEY(EMPNO),
CONSTRAINT FK_EMP2_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT2(DEPTNO)
);
- DEPT2/EMP2 테이블에 데이터를 각각 추가해 보세요
INSERT INTO DEPT2 VALUES(13,'부서1','강남');
INSERT INTO DEPT2(DEPTNO,LOC) VALUES(14,'송파');
-- DNAME컬럼은 DEFAULT로 설정된 '개발부'가 등록됨
SELECT * FROM DEPT2;
예3) 두 개이상의 컬럼이 PK로 설정된다면 테이블레벨로 설정해야 한다.
CREATE TABLE MYSTUDENT
(
STUNUM NUMBER(5), -- 학생번호
TERM VARCHAR2(5), -- 학기
SCORE NUMBER(3), -- 점수
CONSTRAINT PK_STUDENT PRIMARY KEY(STUNUM,TERM)
-- 두개의 컬럼을 PK로 지정함(복합키)
);
INSERT INTO MYSTUDENT VALUES(1,'1-1',100);
INSERT INTO MYSTUDENT VALUES(1,'1-2',80);
INSERT INTO MYSTUDENT VALUES(2,'1-1',90);
INSERT INTO MYSTUDENT VALUES(2,'1-2',70);
INSERT INTO MYSTUDENT VALUES(1,'1-2',70);
-- PK가 중복된값을 갖게 되므로 오류
오류 보고 -
ORA-00001: 무결성 제약 조건(C##SCOTT.PK_STUDENT)에 위배됩니다
예4)
CREATE TABLE DEPT3
(
DEPTNO NUMBER(3) CONSTRAINT PK_DEPT3 PRIMARY KEY,
DNAME VARCHAR2(10),
LOC VARCHAR2(10),
CONSTRAINT UN_DEPT3 UNIQUE(DNAME)
);
INSERT INTO DEPT3 VALUES(10,'영업부','서울');
INSERT INTO DEPT3 VALUES(11,'영업부','부산');
-- 유니크제약조건 위배됨
오류 보고 -
ORA-00001: 무결성 제약 조건(C##SCOTT.UN_DEPT3)에 위배됩니다
2) 제약조건 삭제/추가
# 제약조건 삭제
: ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
예1) ALTER TABLE DEPT3 DROP CONSTRAINT PK_DEPT3;
# 제약조건 추가
: ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건(컬럼명);
예2) ALTER TABLE DEPT3 ADD CONSTRAINT PK_DEPT3 PRIMARY KEY(DEPTNO);