40_[db]제약조건
제약조건
I. 제약 조건의 정의
- 테이블의 특정 열에 대해서 기존 데이터의 수정 및 삭제 가능 여부에 제한을 두는 기준
II. 제약 조건의 종류
- C Type : NOT NULL, CHECK 제약조건
- U Type : UNIQUE 제약조건
- P Type: Primary Key 제약조건
- R Type: Foreign Key 제약조건
제약조건 확인
- USER_CONSTRAINTS 데이터 사전(Data Dictionary) 활용
USER_CONSTRAINTS Data Dictionary
- 제약 조건을 살펴보는 방법
SELECT OWNER AS 소유자,
CONSTRAINT_NAME AS 제약조건명,
CONSTRAINT_TYPE AS 제약조건종류
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP';
참고로, 별칭은 생략해도 좋고, 모든 테이블을 보고 싶다면 WHERE 조건절을 작성하지 않으면 된다
또한, ‘EMP’자리에는 원하는 테이블명을 넣어주면 된다
📌제약 조건의 종류
🌟제약 조건을 테이블 생성 시에 제약조건에 대한 이름(일종의 별칭)도 붙여주기🌟
제약 조건 정의 방식이 크게 컬럼레벨제약조건과 테이블레벨제약조건 정의 방식으로 분류된다는 점에서 이 부분을 살펴보겠다
*제약조건명을 붙이고 싶지 않다면, CONSTRAINT+제약조건별칭 부분을 생략!
[1] 컬럼 레벨 제약 조건 정의를 할 때, 제약 조건 지정과 함께 이름도 지어주기
- NOT NULL 제약조건은 테이블 레벨 제약 조건 정의 방식을 사용할 수 없다
CREATE TABLE 테이블명(
컬럼명 자료형 CONSTRAINT 제약조건에_대한_이름(일종의 별칭) 제약조건
예)
ENAME VARCHAR2(20) CONSTRAINT NN_NAME NOT NULL,
LOGIN_ID VARCHAR2(20) CONSTRAINT PK_TBLG_ID PRIMARY KEY,
LOGIN_PWD VARCHAR2(40) CONSTRAINT CK_TBLG_PWD CHECK(LENGTH(LOGIN_PWD)>8)
);
- ⚠️Primary Key ⚠️
CREATE TABLE 테이블명(
컬럼명 자료형 CONSTRAINT 제약조건별칭 제약조건
);
-Example
CREATE TABLE TEST(
**ID** **VARCHAR2(20)** **CONSTRAINT PK_UID** **PRIMARY KEY**;
);
- ⚠️Foreign Key⚠️
(a)제약조건 별칭을 붙일 때
CREATE TABLE 테이블명(
(다른 열 정의)
컬럼명 열 자료형 CONSTRAINT 제약조건명(=별칭) REFERENCES 참조 테이블(참조할 열)
);
-Example
CREATE TABLE TEST(
DEPT_TITLE VARCHAR2(20) CONSTRAINT FK_DPT REFERENCES REF(DEPT_CODE)
);
(b) 제약조건 별칭을 붙이지 않을 때
CREATE TABLE 테이블명(
(다른 열 정의)
컬럼명 열 자료형 REFERENCES 참조테이블(참조할 열)
);
-Example
CREATE TABLE TEST(
DEPT_TITLE VARCHAR2(20) REFERENCES EMPLOYEE(DEPT_CODE)
);
- UNIQUE 제약조건
CREATE TABLE TEST(
컬럼명 자료형 CONSTRAINT 제약조건별칭 UNIQUE
);
- CHECK 제약조건
CREATE TABLE 테이블명(
컬럼명 자료형 CONSTRAINT 제약조건별칭 CHECK(~)
);
-Example
CREATE TABLE TEST(
TESTER VARCHAR2(20) CONSTRAINT C_TE CHECK(LENGTH(TESTER)>0)
);
- NOT NULL
CREATE TABLE 테이블명(
컬럼명 자료형 CONSTRAINT 제약조건명NOT NULL
);
(2) 테이블 레벨 제약 조건 정의를 할 때, 제약 조건 지정과 함께 이름도 지어주기
CREATE TABLE 테이블명(
컬럼명1 자료형,
컬럼명2 자료형,
...(컬럼명 자료형),
CONSTRAINT 제약조건에_대한_이름(일종의 별칭) 제약조건(컬럼명)
예)
CONSTRAINT PK_TBLG PRIMARY KEY(NO, LOGIN_ID),--기본키제약조건
**CONSTRAINT FK_TBLG FOREIGN KEY(DEPTNO) REFERENCES DEPARTMENT**,--외래키제약조건
CONSTRAINT UN_TBLG UNIQUE(EMP_NO, PHONE),--UNIQUE 제약조건
CONSTRAINT CK_TBLG CHECK(GENDER IN ('M'.'F'))--CHECK 제약조건
);
-
UNIQUE(컬럼1, 컬럼2), PRIMARY KEY(컬럼1, 컬럼2): 컬럼1과 컬럼2 중 둘 중 하나라도 기존값과 다르면 다른 개체로 인식!
-
⚠️Primary Key ⚠️
CREATE TABLE 테이블명(
CONSTRAINT 제약조건별칭 PRIMARY KEY(컬럼명)
);
-Example
CREATE TABLE TEST(
CONSTRAINT PK_UID PRIMARY KEY(ID)
);
- ⚠️Foreign Key⚠️
CREATE TABLE 테이블명(
(다른 열 정의)
CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명) REFERENCES 참조테이블(참조할 열)
--참조할 열을 생략하면, 참조 테이블의 기본키가 들어감
);
-Example
CREATE TABLE TEST(
CONSTRAINT FK_DPT FOREIGN KEY(DEPT_TITLE) REFERENCES DEPARTMENT(DEPT_CODE)
);
- UNIQUE 제약조건
CREATE TABLE 테이블명(
CONSTRAINT 제약조건별칭 UNIQUE(컬럼명)
);
- CHECK 제약조건
CREATE TABLE 테이블명(
CONSTRAINT 제약조건별칭 CHECK(컬럼명을 이용한 조건식)
);
-Example
CREATE TABLE TEST(
CONSTRAINT C_GEN CHECK(GENDER IN ('M','F'))
);
이미 생성된 테이블 내에서 제약조건 수정하기
[방법 1]
ALTER TABLE 테이블명
**MODIFY(컬럼명 제약조건);**
예) ALTER TABLE TEST
MODIFY(TEL NOT NULL);
[방법 2] NOT NULL 외에는 ADD~를 이용
(1) NOT NULL
ALTER TABLE 테이블명
**MODIFY 컬럼명 NOT NULL;**
예: ALTER TABLE TEST
MODIFY TEL NOT NULL;
(2) FOREIGN KEY
ALTER TABLE 우리가 제약조건을 부여할 테이블명
ADD FOREIGN KEY(컬럼명) REFERENCES 참조를 당하는 테이블명(참조하는 컬럼명)
--예:
ALTER TABLE TEST
ADD FOREIGN KEY(DEPT_TITLE) REFERENCES DEPARTMENT(DEPT_CODE)
(3) PRIMARY KEY
ALTER TABLE 테이블명
ADD PRIMARY KEY(컬럼명);
--예:
ALTER TABLE TEST
ADD PRIMARY KEY(USER_ID);
(4) UNIQUE
ALTER TABLE 테이블명
ADD UNIQUE(컬럼명);
--예
ALTER TABLE TEST
ADD UNIQUE(USER_ID);
(5) CHECK
ALTER TABLE 테이블명
ADD CHECK(조건식);
--예
ALTER TABLE TEST
ADD CHECK(LENGTH(NAME)>0);
DEFAULT : 기본값을 정할 때 사용
- 제약조건과 별개로, 특정 열에 저장할 값이 지정되지 않았을 경우, 지정 가능
*테이블 생성 시 , default 제약조건 설정하기
CREATE TABLE 테이블명(
컬럼명 자료형 DEFAULT 값;
);
--예
CREATE TABLE TEST(
LOGIN_PWD VARCHAR2(20) DEFAULT '1111'
);
- 이미 존재하는 테이블에서 제약조건 수정하기
1) Oracle
ALTER TABLE 테이블명
MODIFY 컬럼명DEFAULT 값;
--예:
ALTER TABLE TEST
MODIFY LOGIN_PWD DEFAULT '1234';
2) MySQL
ALTER TABLE 테이블명
ALTER 컬럼명 SET DEFAULT 값;
--예
ALTER TABLE TEST
ALTER LOGIN_PWD DEFAULT '1234';
제약조건 비활성화, 활성화
- 비활성화: DISABLE
- 활성화: ENABLE
ALTER TABLE 테이블명
ENABLE/DISABLE [NOVALIDATE/VALIDATE(선택)] CONSTRAINT 제약조건명;
➡️ ENABLE VALIDATE == ENABLE :제약조건이 활성화되어, 모든 행에 대해서 적용
➡️ ENABLE NOVALIDATE : 새로 생성되거나 수정된 행에 대해서만 제약조건이 활성화됨!
[단, 기존에 존재했던(existing) 데이터는 제약조건을 위배할 수 있음]
➡️ DISABLE VALIDATE : 제약조건이 검사되지 않을 수 있지만, 제약조건이 설정된 열은 이러한 경향을 따르지 않을 수 있음
➡️ DISABLE NOVALIDATE == DISABLE : 제약조건이 위배되고, 제약조건을 검사하지 않음!
➡️ VALIDATE/NOVALIDATE : ▶️ 제약조건 검사 여부