본문 바로가기
Database/SQL

[PostgreSQL] 제약 조건

by 혀나Lee 2016. 9. 26.

데이터 타입은 테이블에 데이터의 종류로 저장될 수 있다. SQL은 컬럼과 테이블에 제약 조건을 정의할 수 있다. 만약, 제약 조건에 맞지않는 데이터를 저장하려고 할 때 에러가 발생하게 된다. 

제약 조건(Constraint)은 데이터의 무결성을 지키기 위해 제한된 조건을 말한다. 제약 조건에는 몇 가지 종류가 있으며 지원하는 수준도 DBMS에 따라 조금씩 다르다. 이 페이지는 PostgreSQL를 기준으로 제약 조건을 설명할 것이다.

제약 조건의 종류

  • Check Constraints
  • Not-Null Constraints
  • Unique Constraints
  • Primary Keys
  • Foreign Keys

Check Constraints

Check Constraints는 가장 일반적인 제약 조건이다. Check Constraint는 특정 조건들로 이루어진 수식을 통해 입력되는 데이터를 검증할 때 사용된다.
CREATE TABLE products (
product_no integer,
name text, 
price numeric CHECK 제약명 (price > 0)
);

또한, 제약명을 줄 수 있는데 제약명을 줌으로써 에러 메시지를 분명히 할 수 있다. 

제약 작성 방법 세 가지

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 (
product_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_no와 name은 필수값이며 값을 입력하지 않을 경우 에러가 발생한다.

CREATE TABLE products (
product_no integer NOT NULL,
name text NULL,
price numeric
);
데이터베이스는 Null 기본값이기 때문에 name과 price의 형식은 같다고 본다. 

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)

기본 키는 하나의 테이블에 있는 데이터들을 식별하기 위한 기준으로 인식되는 제약조건이다. 기본 키는 한 개의 테이블에 하나만 생성 가능하며, 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 products (

a integer,

b integer,

c integer,

Primary Key (a, c)

);

하지만 기본 키를 여러 컬럼으로 구성할 것보다 기본 키를 위한 컬럼을 하나 두는 것이 더 좋다.


외래 키 (Foreign Keys)

두 테이블 사이의 관계를 선언함으로써, 데이터의 무결성을 보장해 주는 역할을 한다. 외래 키 관계를 설정하게 되면 외래 키 테이블이 다른 테이블(기준 테이블)에 의존하게 된다. 외래 키는 '기준 테이블'을 참조하기 때문에, 반드시 '기준 테이블'에 존재하는 데이터만 입력이 가능하며, 참조하는 '기준 테이블'의 컬럼은 반드시 PK이거나 Unique이어야 한다.

  • 외래 키가 있는 테이블은 기준 테이블에 의존
  • 반드시 기준 테이블에 존재하는 값만 입력 가능
  • 참조하는 기준 테이블의 컬럼은 반드시 Primary Key이거나 Unique이어야 함

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)

);


'Database > SQL' 카테고리의 다른 글

[SQL] ALTER RENAME  (0) 2016.12.14
[PostgreSQL] 도메인, 인덱스, 트리거  (0) 2016.09.26
[PostgreSQL] 함수(Function)  (1) 2016.09.26
[SQL] 저장 프로시저(Procedure)  (0) 2016.09.26
[SQL] 뷰(View)  (0) 2016.09.23

댓글