3 minute read

제약조건

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’자리에는 원하는 테이블명을 넣어주면 된다

📌제약 조건의 종류

Database-제약조건

🌟제약 조건을 테이블 생성 시에 제약조건에 대한 이름(일종의 별칭)도 붙여주기🌟

제약 조건 정의 방식이 크게 컬럼레벨제약조건과 테이블레벨제약조건 정의 방식으로 분류된다는 점에서 이 부분을 살펴보겠다

*제약조건명을 붙이고 싶지 않다면, 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 제약조건명;

https://oracle-base.com/articles/8i/constraint-checking-updates#:~:text=ENABLE NOVALIDATE means the constraint,is the same as DISABLE .

➡️ ENABLE VALIDATE == ENABLE :제약조건이 활성화되어, 모든 행에 대해서 적용

➡️ ENABLE NOVALIDATE : 새로 생성되거나 수정된 행에 대해서만 제약조건이 활성화됨!

[단, 기존에 존재했던(existing) 데이터는 제약조건을 위배할 수 있음]

➡️ DISABLE VALIDATE : 제약조건이 검사되지 않을 수 있지만, 제약조건이 설정된 열은 이러한 경향을 따르지 않을 수 있음

➡️ DISABLE NOVALIDATE == DISABLE : 제약조건이 위배되고, 제약조건을 검사하지 않음!

➡️ VALIDATE/NOVALIDATE : ▶️ 제약조건 검사 여부

Updated: