[SQL] 제약조건

김용준·2022년 11월 2일

SQL

목록 보기
14/17

제약조건이란?

테이블의 특정 컬럼에 저장될 수 있는 데이터의 조건이다. 제약조건을 지정하면 조건에 부합하지 않는 데이터는 저장할 수 없다. 오라클에서 사용하는 제약조건은 다음과 같다.

  • NOT NUUL

    • 지정한 컬럼에 NULL을 허용하지 않는다.
CREATE TABLE 테이블명 (
	컬럼명 자료형 NOT NULL);
  • UNIQUE

    • 지정한 컬럼의 값은 유일한 값이어야 한다. 즉, 중복을 허용하지 않는다.
    • 그러나 NULL은 중복이 가능하다.
CREATE TABLE 테이블명 (
	컬럼명 자료형 UNIQUE);
  • PRIMARY KEY
    • 테이블의 각 행을 대표하는 컬럼에 정의되는 제약조건이다.
    • 지정한 컬럼의 값이 유일한 값이면서 NULL을 허용하지 않는다.
    • 테이블에 한 컬럼만 지정 가능하다.
    • 하나 이상의 컬럼을 사용해서 정의할 수 있다. (복합키)
CREATE TABLE 테이블명 (
	컬럼명 자료형 PRIMARY KEY);
  • FOREIGN KEY

    • 해당 컬럼의 값이 다른 테이블(혹은 같은 테이블)의 특정 컬럼이 가지고 있는 값과 관련있는 값만 가져야 한다.
    • 다른 컬럼이 참조하는 컬럼은 반드시 기본키 제약조건이 정의된 컬럼이어야 한다.
    • 예를 들어, 주문 테이블의 주문자 아이디는 회원 테이블의 회원 아이디 컬럼의 값과 일치하는 값만 허용된다.
-- 컬럼레벨 제약조건 정의, []는 생략 가능
CREATE TABLE 테이블명 (
	컬럼명 자료형 [CONSTRAINT 제약조건] REFERENCES 참조테이블 (참조컬럼));

-- 테이블레벨 제약조건 정의, []는 생략 가능
CREATE TABLE 테이블명 (
	[CONSTRAINT 제약조건] FOREIGN KEY (컬럼명) REFERENCES 참조테이블 (참조컬럼));
  • CHECK

    • 제시된 조건을 만족하는 값만 가질 수 있게 한다.
    • 예를 들어, 성별 컬럼은 '남', '여' 둘 중 한 값만 가질 수 있다.
CREATE TABLE 테이블명 (
	컬럼명 자료형 CHECK (조건식));

제약조건 정의 방법

-- 컬럼레벨 제약조건 정의, []는 생략 가능
CREATE TABLE 테이블명 (
	컬럼명 자료형 [CONSTRAINT 제약조건별칭] 제약조건,
	컬럼명 자료형 [CONSTRAINT 제약조건별칭] 제약조건,
    										 . . .);
                                            
-- 테이블레벨 제약조건 정의, []는 생략 가능
CREATE TABLE 테이블명 (
	컬럼명 자료형,
	컬럼명 자료형,
    . . . 
	[CONSTRAINT 제약조건별칭] 제약조건 (컬럼명1),
	[CONSTRAINT 제약조건별칭] 제약조건 (컬럼명2, 컬럼명3),
    										  . . .);
  • 하나의 컬럼에 여러 제약조건을 지정할 경우 첫 번째 제약조건은 컬럼레벨에서 정의하고 나머지는 테이블레벨에서 정의한다.

  • 두 개 이상의 컬럼에 같은 제약조건을 정의해야할 경우 테이블레벨로 정의한다.

  • 일반적으로 하나의 컬럼에 NOT NULL 제약조건과 다른 제약조건을 같이 정의할 때, NOT NULL 제약조건은 컬럼레벨로 정의하고 나머지 컬럼의 제약조건은 테이블레벨로 정의한다.

주의사항

제약조건은 테이블에 데이터를 저장할 때 뿐만 아니라 변경, 삭제할 때에도 제약조건을 검사한다.

예를 들어, SAMPLE_CART_ITEMS 테이블의 PRODUCT_NOSAMPLE_PRODCUTSPRODUCT_NO 컬럼의 값을 참조한다. 그러면 SAMPLE_CART_ITEMS FOREIGN KEY는 PRODUCT_NO이고, SAMPLE_PRODCUTS의 PRIMARY KEY는 PRDUCT_NO이다.

이때, SAMPLE_PRODUCTS 테이블의 PRODUCT_NO는 함부로 UPDATE나 DELETE작업을 수행할 수 없다. SAPLE_CART_ITEMS 테이블에서 이미 PRODUCT_NO를 참조하고 있기 때문이다. 만약 SAPLE_CART_ITEMS 테이블에서 참조하고 있는 PRODUCT_NO를 변경, 삭제하려고 한다면 다음과 같은 오류가 발생할 것이다.


profile
차선이 모여 최선이 된다.

0개의 댓글