제약조건(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(10) CONSTRAINT 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(10) NOT 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(10) NOT NULL,
5 CONSTRAINT test05_hh_pk PRIMARY KEY (hh),
6 CONSTRAINT test05_ii_uk UNIQUE (ii)
7 );
테이블이 생성되었습니다.
-- constraint을 테이블 만들 때 뒤쪽에 따로 추가하는 방법
|
cs |
'DataBase > DataBase Basic' 카테고리의 다른 글
db에서 등장하는 cursor개념, fetch개념 (0) | 2021.08.07 |
---|---|
connection pool, why use connection pool, how to control db connection per sql (0) | 2021.08.07 |
기본키 이해하기, 기본키의 예시, 기본키를 사용하면 무엇이 좋은가 (0) | 2021.07.04 |
외래키 이해하기, 외래키의 예시, 외래키를 사용하면 무엇이 좋은가? (0) | 2021.07.04 |
DBMS별 Schema(스키마) 와 Database와 차이점 (0) | 2021.07.04 |