[SQL] 제약

가비·2020년 12월 27일
0

[SQL]

목록 보기
7/13

제약이란? 제약은 테이블에 설정하는 것이다. CREATE로 테이블 생성시 정의하거나 ALTER로 변경할 수 있다.

테이블 작성시 제약 정의

# 열 제약 정의
mysql> CREATE TABLE sample631 (
    -> a INTEGER NOT NULL,
    -> b INTEGER NOT NULL UNIQUE,
    -> c VARCHAR(30)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> DESC sample631;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | int         | NO   |     | NULL    |       |
| b     | int         | NO   | PRI | NULL    |       |
| c     | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 하나의 열에 대한 제약은 열을 정의할 때 지정한다. 이처럼 열에 대해 정의하는 제약을 열 제약이라 부른다.
# 테이블 제약 정의
mysql> CREATE TABLE sample632 (
    -> no INTEGER NOT NULL,
    -> sub_no INTEGER NOT NULL,
    -> name VARCHAR(30),
    -> PRIMARY KEY(no, sub_no)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> DESC sample632;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| no     | int         | NO   | PRI | NULL    |       |
| sub_no | int         | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
  • '복수열에 의한 기본키 제약'처럼 한 개의 제약으로 복수 열에 제약을 지정하는 경우를 테이블 제약이라 부른다.
mysql> CREATE TABLE sample633(
    -> no INTEGER NOT NULL,
    -> sub_no INTEGER NOT NULL,
    -> name VARCHAR(30),
    -> CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no) 👉 제약 이름 지정
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> DESC sample633;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| no     | int         | NO   | PRI | NULL    |       |
| sub_no | int         | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 제약에 이름을 붙이면 관리하기 쉬워지므로 가능한 이름을 붙이도록 한다.

제약 추가

열 제약 추가

# c 열에 NOT NULL 제약 걸기
mysql> ALTER TABLE sample631 MODIFY c VARCHAR(30) NOT NULL;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC sample631;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | int         | NO   |     | NULL    |       |
| b     | int         | NO   | PRI | NULL    |       |
| c     | varchar(30) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 기존 테이블을 변경할 경우 제약을 위반하는 데이터가 있는지 먼저 검사한다.

테이블 제약 추가

# 기본키 제약 추가
mysql> ALTER TABLE sample631 ADD CONSTRAINT pkey_sample631 PRIMARY KEY(a);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC sample631;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | int         | NO   | PRI | NULL    |       |
| b     | int         | NO   | UNI | NULL    |       |
| c     | varchar(30) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • ALTER TABLE의 ADD 하부명령으로 추가할 수 있다.
  • 기본키는 테이블에 하나만 설정할 수 있다.

제약 삭제

# c 열의 NOT NULL 제약 삭제
mysql> ALTER TABLE sample631 MODIFY c VARCHAR (30);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC sample631;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | int         | NO   | PRI | NULL    |       |
| b     | int         | NO   | UNI | NULL    |       |
| c     | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 기본키 제약 삭제
mysql> ALTER TABLE sample631 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC sample631;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | int         | NO   |     | NULL    |       |
| b     | int         | NO   | PRI | NULL    |       |
| c     | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 기본키는 테이블당 하나만 설정할 수 있기 때문에 제약명을 지정하지 않고도 삭제할 수 있다.

기본키

mysql> CREATE TABLE sample634(
    -> p INTEGER NOT NULL,
    -> a VARCHAR (30),
    -> CONSTRAINT pkey_sample634 PRIMARY KEY(p)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> DESC sample634;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| p     | int         | NO   | PRI | NULL    |       |
| a     | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> INSERT INTO sample634 VALUES (3, '셋째줄');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM sample634;
+---+-----------+
| p | a         |
+---+-----------+
| 1 | 첫째줄      |
| 2 | 둘째줄      |
| 3 | 셋째줄      |
+---+-----------+
3 rows in set (0.00 sec)

mysql> INSERT INTO sample634 VALUES (2, '넷째줄');
ERROR 1062 (23000): Duplicate entry '2' for key 'sample634.PRIMARY'

mysql> UPDATE sample634 SET p = 2 WHERE p = 3;
ERROR 1062 (23000): Duplicate entry '2' for key 'sample634.PRIMARY'
  • 기본키로 지정할 열은 NOT NULL 제약이 설정되어 있어야 한다.
  • 기본키는 테이블의 행 하나를 특정할 수 있는 검색키이다.
    👉 기본키로 설정된 열이 중복하는 데이터 값을 가지면 제약에 위반된다.
  • 열을 기본키로 지정해 유일한 값을 가지게 하는 구조가 기본키 제약이다.
    👉 행이 유일성을 필요로 한다는 의미에서 '유일성 제약'이라 불리기도 한다.

복수 열로 기본키 구성하기

mysql> SELECT a, b FROM sample635;
+---+---+
| a | b |
+---+---+
| 1 | 1 | 👉 a 열만 봤을 때는 중복 값이 있지만 b 열이 다르기때문에 키 전체로서는 중복되지 않는다.
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
+---+---+
5 rows in set (0.01 sec)
  • 키를 구성하는 모든 열을 사용해서 중복 값이 있는지를 검사한다.

0개의 댓글