테이블 제약조건

다훈·2024년 8월 19일

제약조건 CONSTRAINTS

  • 원하는 데이터값만 항상 유지(보관)하기 위해서 데이터 무결성 보장을 목적으로 특정 컬럼마다 설정하는 제약이다.

  • 제약조건이 부여된 컬럼에 들어올 데이터에 문제가 있는지 없는지 자동으로 검사할 목적으로 사용한다. (애초에 데이터에 문제가 있다면 INSERT 되지 않는다.)

제약조건의 종류

  1. NOT NULL
  2. UNIQUE
  3. CHECK
  4. PRIMARY KEY
  5. FOREIGN KEY

1. NOT NULL 제약조건

해당 컬럼에 반드시 값이 존재해야 하는 경우 사용하는 제약조건. 즉, NULL 값이 절대 들어와서는 안되는 컬럼에 부여한다.

-- 표현법 (컬럼 레벨 방식만 존재):
CREATE TABLE 테이블명 (
    컬럼명 자료형 NOT NULL,
    ...
);

2. UNIQUE 제약조건

컬럼에 중복값을 제한하는 제약조건.
삽입 or 수정 시 기존에 해당 컬럼값 중에 중복값이 있을 경우
추가 또는 수정이 되지 않게 제약한다.

컬럼레벨 / 테이블레벨방식 둘 다 가능

-- 표현법
-- 컬럼 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형 UNIQUE,
    ...
);

-- 테이블 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형,
    CONSTRAINT 제약조건명 UNIQUE (컬럼명)
);

3. CHECK 제약조건

컬럼에 기록될 수 있는 값에 대한 "조건식" 을 설정해줄 수 있다.

CHECK 제약조건에서 NULL 값은 조건을 평가하지 않으므로 NOT NULL과 함께 설정 필요

-- 표현법
-- 컬럼 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형 CHECK(조건식),
    ...
);
-- 테이블 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형,
    CONSTRAINT 제약조건명 CHECK(조건식)
);

4. PRIMARY KEY 제약조건

테이블에서 각 행들의 정보를 유일 하게 식별 할 수 있는 컬럼에 부여하는 제약조건. 각 행들을 구분할 수 있는 식별자의 역할이다.

  • 중복되지 않고 값이 존재해야만 하는 컬럼에 PRIMARY KEY 제약조건을 부여하는 것이 좋다. (NOT NULL + UNIQUE 합친 느낌)
  • 단, 한 테이블 당 한개만 지정 가능 (최소성)
-- 표현법
-- 컬럼 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형 PRIMARY KEY,
    ...
);
-- 테이블 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형,
    CONSTRAINT 제약조건명 PRIMARY KEY (컬럼명)
);

-- 복합키 설정 (테이블 레벨 방식만 존재):
CREATE TABLE 테이블명 (
    컬럼명 자료형,
    PRIMARY KEY (컬럼명1, 컬럼명2)
);
  • PRIMARY KEY는 자동으로 NOT NULL과 UNIQUE 제약조건을 포함.
  • 복합키는 여러 컬럼의 조합이 고유해야 한다.

5. FOREIGN KEY 제약조건

FOREIGN KEY는 자식 테이블의 특정 컬럼이 부모 테이블의 특정 컬럼 값을 참조하도록 설정한다.
부모 테이블에 없는 값을 입력하려 하면 오류가 발생한다.

-- 표현법
-- 컬럼 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형 REFERENCES 부모테이블명(참조할컬럼명),
    ...
);

-- 테이블 레벨 방식
CREATE TABLE 테이블명 (
    컬럼명 자료형,
    CONSTRAINT 제약조건명 FOREIGN KEY (컬럼명) REFERENCES 부모테이블명(참조할컬럼명)
);
  • 기본적으로 외래키는 ON DELETE RESTRICT로 설정되어 부모 테이블의 데이터를 삭제할 때 자식 테이블에 해당되는 값이 존재하면 삭제 불가.
  • ON DELETE CASCADE: 부모 데이터 삭제 시 자식 데이터도 자동으로 삭제.
  • ON DELETE SET NULL: 부모 데이터 삭제 시 자식 테이블의 외래키 값을 NULL로 설정.
  • 부모 테이블이 먼저 생성되어야 하며, 부모 테이블에 없는 값은 자식 테이블에 입력 불가.
profile
Devlog

0개의 댓글