SQL 기초] 제약 조건(Constraint)

2017.03.03 22:31



제약조건(Constraint)은 테이블에 잘못된 데이터의 입력을 막기위해 일정한 규칙을 지정하는 것이다.

SQL에서는 여러가지 제약을 사용할 수 있다. 



제약조건의 종류


- NOT NULL : NULL값 입력 금지

- UNIQUE : 중복값 입력 금지 (NULL값은 중복입력 가능)

- PRIMARY KEY : NOT NULL + UNIQUE

- FOREIGN KEY : 다른 테이블의 컬럼을 조회해서 무결성 검사

- CHECK : 조건으로 설정된 값만 입력 허용




컬럼에 제약 설정하기


제약조건은 CREATE TABLE 명령으로 테이블을 생성할 때 테이블에 대해서 제약을 걸 수도 있고, 컬럼에 제약을 걸 수도 있다. 


컬럼 레벨의 제약조건은 칼럼을 정의할 때 해당 컬럼별로 지정하는 제약조건으로 특히 NOT NULL 제약조건은 컬럼 레벨에서만 정의할 수 있다. 



1
2
3
4
5
6
7
8
9
10
11
12
 SCOTT @ ORACLE > CREATE TABLE test03(
  2     aa NUMBER NOT NULL,
  3     bb NUMBER NOT NULL UNIQUE,
  4     cc VARCHAR(10)
  5  );
 
테이블이 생성되었습니다.
 
 
-- aa 컬럼에는 NOT NULL 제약이, bb 컬럼에는 NOT NULL 제약과 UNIQUE 제약이 걸려있다. 
 
-- 이런 제약을 컬럼에 대해 제약이라고 한다. 
cs





테이블에 제약 설정하기



테이블 레벨의 제약조건은 제약조건이 하나 이상의 컬럼을 사용하거나, 하나의 컬럼에 두 개 이상의 제약조건을 지정하는 경우에 사용한다. 



1
2
3
4
5
6
7
8
9
10
11
 SCOTT @ ORACLE > CREATE TABLE test04(
  2             ee NUMBER NOT NULL,
  3             ff NUMBER NOT NULL,
  4             gg VARCHAR(10),
  5             PRIMARY KEY(ee, ff)
  6  );
 
테이블이 생성되었습니다.
 
 
-- 한 개의 제약(PRIMARY)을 복수의 컬럼(ee, ff)에 설정하는 테이블 제약
cs





 제약조건에 이름 붙이기


제약조건 설정시 CONSTRAINT 키워드를 사용해서 제약조건에 대한 이름을 지정해 줄 수 있다. 

이름을 지정하지 않으면 자동으로 생성되는데 나중에 제약조건을 비활성화하거나 삭제하는 등의 관리를 위해서는 제약조건에 이름을 지정해주는 것이 좋다. 


1
2
3
4
5
6
7
8
9
 SCOTT @ ORACLE > CREATE TABLE test05(
  2             hh NUMBER CONSTRAINT test05_hh_pk PRIMARY KEY,
  3             ii NUMBER CONSTRAINT test05_ii_uk UNIQUE,
  4             jj VARCHAR(10CONSTRAINT test05_jj_nn NOT NULL
  5  );
 
테이블이 생성되었습니다.
 
-- 제약조건의 이름을 "테이블명_컬럼명_제약종류"로 
cs



오라클의 경우 위 그림처럼 테이블을 만들 때 Constraint 키워드를 사용해서 제약조건의 이름을 지정할 수 있지만 mysql의 경우 이런 방법을 사용하면 에러가 나온다. 


mysql에서 컬럼 레벨의 제약조건인 not null은 컬럼명 뒤에 붙일 수 있지만 다른 제약조건들은 컬럼 설정 뒤에 이름과 함께 추가하는 방법을 사용한다.  

(물론 이 방법은 오라클에서도 사용가능하다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql [test_db] >  CREATE TABLE test05(
    ->    hh INT,
    ->    ii INT,
    ->    jj VARCHAR(10NOT NULL,
    -> CONSTRAINT test05_hh_pk PRIMARY KEY (hh),
    -> CONSTRAINT test05_ii_uk UNIQUE (ii)
    ->   );
Query OK, 0 rows affected (0.09 sec)
 
 
 
mysql [test_db] > desc test05
    -> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| hh    | int(11)     | NO   | PRI | NULL    |       |
| ii    | int(11)     | YES  | UNI | NULL    |       |
| jj    | varchar(10| NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
 
-- 테이블 레벨에서 constraint를 이름과 함께 설정
cs



1
2
3
4
5
6
7
8
9
10
11
 SCOTT @ ORACLE >   CREATE TABLE test05(
  2     hh number,
  3     ii number,
  4     jj VARCHAR(10NOT NULL,
  5  CONSTRAINT test05_hh_pk PRIMARY KEY (hh),
  6  CONSTRAINT test05_ii_uk UNIQUE (ii)
  7  );
 
테이블이 생성되었습니다.
 
-- constraint을 테이블 만들 때 뒤쪽에 따로 추가하는 방법
cs



또루아빠 SQL(오라클,mysql) , , , , , , , , , , , ,