[SQL] 제약
제약이란? 제약은 테이블에 설정하는 것이다. 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)
- 키를 구성하는 모든 열을 사용해서 중복 값이 있는지를 검사한다.
Author And Source
이 문제에 관하여([SQL] 제약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ggg9_/SQL-제약저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)