Database

[DATABASE] constraint의 적용

ju_young 2023. 11. 17. 17:04
728x90

PRIMARY KEY

  • Table의 tuple을 식별하기 위해 사용하며 하나 이상의 attribute로 구성
  • 중복된 값을 가질 수 없으며 NULL을 가질 수 없다. 예를 들어 다음과 같이 Primary Key인 id가 같은 tuple이 존재하면 안된다.
id title
1 title1
1 title2
2 title3

attribute가 하나일 때

create table Article(
    id INT PRIMARY KEY,
    ...
);

attribute가 하나 이상일 때

create table Article(
    id INT,
    ...
    PRIMARY KEY (id)
);

attribute가 두 개 이상일 경우 PRIMARY KEY(id, number)처럼 선언해주면 된다.

UNIQUE

  • Unique로 지정된 attribute는 중복된 값을 가질 수 없다
  • MySQL, PostgreSQL의 경우 NULL은 중복을 허용한다

attribute가 하나일 때

create table Article(
    id INT PRIMARY KEY,
    title VARCHAR(50) UNIQUE,
    ....
);

attribute가 하나 이상일 때

create table Member(
    id INT,
    email VARCHAR(50),
    ...
    UNIQUE(id, email)
);

NOT NULL

  • attribute가 NOT NULL로 지정되면 해당 attribute는 NULL을 가질 수 없다
create table Article (
    ...
    title VARCHAR(50) NOT NULL UNIQUE,
    ...
);

UNIQUE의 경우 NULL 값은 중복을 허용할 수 있기 때문에 대부분 NOT NULL과 같이 선언해준다.

DEFAULT

  • attribute의 default 값을 정의할 때 사용
  • 새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default 값으로 저장
create table Article (
    ...
    like INT DEFAULT 0,
    ...
);

CHECK

  • attribute의 값을 제한해야할 경우 사용

attribute가 하나일 때

create table Member(
    ...
    age INT CHECK (age >= 20),
    ....
);

attribute가 하나 이상일 때

create table Article(
    created_date DATE,
    modified_date DATE,
    ...
    CHECK (modified_date >= created_date)
);

FOREGIN KEY

  • attribute가 다른 table의 primary key나 unique key를 참조할 때 사용
create table Article (
    ...
    comment_id INT,
    FOREIGN KEY (comment_id)
        references Comment(id)
        on delete {reference_option}
        on update {reference_option}
);

reference option

종류 설명
CASCADE 참조값의 삭제/변경을 그대로 반영
SET NULL 참조값이 삭제/변경시 NULL로 변경
RESTRICT 참조값이 삭제/변경되는 것을 금지
NO ACTION RESTRICT와 유사
SET DEFAULT 참조값이 삭제/변경시 default 값으로 변경

constraint 네이밍

  • constraint에 이름을 명시해주면 위반했을 경우 명시된 이름으로 에러 메시지가 나타나기때문에 쉽게 파악할 수 있다
  • constraint를 삭제하고 싶을 경우 명시해준 이름으로 삭제할 수 있다
create table Member(
    ...
    age INT CONSTRAINT age_over CHECK (age >= 20),
    ....
);
728x90