PostgreSQL

GreenBean·2022년 2월 18일
0
post-thumbnail

PostgreSQL

제약 조건(constraint)이란?

  • 데이터 타입은 테이블에 데이터의 종류로 저장될 수 있음
    • SQL은 테이블과 컬럼에 제약 조건을 정의할 수 있음
    • 만약 제약 조건에 맞지 않는 데이터를 저장하려고 할 때 에러가 발생
  • 제약 조건(constraint)은 데이터의 무결성을 지키기 위해 제한된 조건
    • 제약 조건에는 몇 가지 종류가 있으며 지원하는 수준도 DBMS에 따라 조금씩 다름

제약 조건의 종류

Check Constraints

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK "제약명" (price>0)
);
  • Check Constraints는 가장 일반적인 제약 조건
    • Check Constraints는 특정 조건들로 이루어진 수식을 통해 입력되는 데이터를 검증할 때 사용
    • 또한 "제약명"을 줄 수 있는데 제약명을 줌으로써 에러 메시지를 분명히 할 수 있음
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

CREATE TABLE products (
    prodcut_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0 AND price > discounted_price)
);

Not-Null Constraints

  • Not-Null 제약은 데이터 입력 시에 누락 되어서는 안되는 부분
    • 데이터베이스는 Null""0은 각각 다름
    • Null이 기본값이며 ""0은 각기 값을 갖고 있는 것
CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric
);
  • 위 예시의 경우 데이터 입력 시에 product_noname은 필수값이며 값을 입력하지 않을 경우 에러가 발생
CREATE TABLE products (
    product_no integer NOT NULL,
    name text NULL,
    price numeric
);
  • 위 예시의 경우 데이터베이스는 Null 기본값이기 때문에 nameprice의 형식은 같다고 봄

Unique Constraints

  • Unique는 해당 테이블에 있어서 존재하는 값이 유일해야 함
    • 만약 데이터 입력∙수정 시에 중복되는 값이 있으면 에러 발생
    • 하지만 Null값은 데이터로 인식하지 않기 때문에 Null에 대해서는 Unique가 적용되지 않음
      • Unique 조건이 있는 해당 컬럼에 대해 Null이 여러개 존재할 수 있음
    • Unique는 한 컬럼 또는 컬럼들의 그룹에 조건을 추가할 수 있음
CREATE TABLE products (
    product_no integer UNIQUE,
    name text,
    price numeric
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    UNIQUE (product_no)
);

CREATE TABLE products (
    product_no integer CONSTRAINT must_be_different UNIQUE,
    name text,
    price numeric
);

Primary Keys

  • 기본 키(Primary Key, PK)는 하나의 테이블에 있는 데이터들을 식별하기 위한 기준으로 인식되는 제약 조건
    • 기본 키는 한 개의 테이블에 하나만 생성 가능하며, Null값이 있으면 안되고 중복되지 않는 유일한 값이어야 함
      • 한 개의 테이블에 하나만 생성 가능
      • Not-Null
      • Unique
CREATE TABLE products (
    product_no integer UNIQUE NOT NULL,
    name text,
    price numeric
);

CREATE TABLE products (
    product_no integer Primary Key,
    name text,
    price numeric
);
  • 기본 키는 여러 컬럼으로 이루어진 경우도 있는데, 이러한 경우 Unique와 비슷하게 작성할 수 있음
CREATE TABLE procuts (
    a integer,
    b integer,
    c integer,
    Primary Key (a, c)
);
  • 하지만 기본 키를 여러 컬럼으로 구성하는 것보다 기본 키를 위한 컬럼을 하나 두는 것이 더 좋음

Foreign Keys

  • 두 테이블 사이의 관계를 선언함으로써, 데이터의 무결성을 보장해 주는 역할을 함
    • 외래 키(Foreign Key, FK) 관계를 설정하게 되면 외래 키 테이블이 다른 테이블(기준 테이블)에 의존하게 됨
    • 외래 키는 '기준 테이블'을 참조하기 때문에, 반드시 '기준 테이블'에 존재하는 데이터만 입력 가능하며, 참조하는 '기준 테이블'의 컬럼은 반드시 Unique이거나 Primary Key여야 함
      • 외래 키가 있는 테이블은 기준 테이블에 의존
      • 반드시 기준 테이블에 존재하는 값만 입력 가능
      • 참조하는 기준 테이블의 컬럼은 반드시 Unique이거나 Primary Key여야 함
CREATE TABLE products (
    product_no integer Primary Key,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer Primary Key,
    product_no integer REFERENCES products (product_no),
    quantity integer
);
  • 기준 테이블과 같은 컬럼명을 사용할 경우 테이블 명만 작성하여 표현할 수 있음
CREATE TABLE orders (
    order_id integer Primary Key,
    product_no integer REFERENCES products,
    quantity integer
);
  • 기준 테이블의 기본 키가 여러 컬럼으로 이루어진 경우
CREATE TABLE orders (
    a integer Primary Key,
    b integer
    c integer,
    FOREIGN KEY (b, c) REFERENCES other_table(c1, c2)
);
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글