> ALTER TABLE 테이블명 ADD 추가할 컬럼명 데이터 유형;
> ALTER TABLE 테이블명 DROP COLUMN 삭제할 컬럼명;
> ALTER TABLE 테이블명 MODIFY (컬럼명1 데이터 유형 [DEFAULT 식] [NOT NULL],
컬럼명2 데이터 유형 [DEFAULT 식] [NOT NULL]);
> ALTER TABLE 테이블명 RENAME COLUMN 변경해야할 컬럼명 TO 새로운 컬럼명;
> ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건 (컬럼명);
> ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
mysql > CREATE TABLE sample531 (
-> no INTEGER NOT NULL UNIQUE,
-> name VARCHAR(8) NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
mysql > DESC sample531;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| no | int | NO | PRI | NULL | |
| name | varchar(8) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
이처럼 열에 대해 정의하는 제약을 열 제약이라 합니다.
NOT NULL 제약조건 및 기본키(PRIMARY KEY) 제약조건을 가진 no열과 sub_no열, 그리고 아무런 제약조건을 가지고 있지 않은 name열로 구성된 테이블 sample632를 만드는 방법은 아래와 같습니다.
mysql > CREATE TABLE sample632 (
-> no INTEGER NOT NULL,
-> sub_no INTEGER NOT NULL,
-> name VARCHAR(8),
-> 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(8) | YES | | NULL | |
+--------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
이처럼 한 개의 제약으로 복수의 열에 제약을 설정하는 경우를 테이블 제약이라 합니다.
CONSTRAINT
키워드를 사용하여 제약의 이름을 지정할 수 있습니다. mysql > CREATE TABLE sample631 (
-> no INTEGER NOT NULL,
-> CONSTRAINT pkey_sample631 PRIMARY KEY (no)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql > DESC sample631;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| no | int | NO | PRI | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
ALTER TABLE
로 열 정의를 변경할 때MODIFY
하부명령을 통해 해당 열에 제약조건을 추가할 수 있습니다.
이때 유의할 점은 기존 존재하던 데이터에 해당 제약조건이 영향을 끼치기 때문에 만약 제약을 위반하는 데이터가 있다면 오류가 발생합니다.
ALTER TABLE
명령의 ADD
하부명령으로 추가할 수 있습니다. 예를 들면 아래 명령문과 같은 방식으로 테이블 제약을 추가할 수 있습니다.
ALTER TABLE sample631 ADD CONSTRAINT pkey_sample631 PRIMARY KEY (no);
열 제약은 열 정의를 변경하는 방식으로 변경할 수 있고 테이블 제약은 삭제할 수 있습니다.
먼저 열 제약을 삭제하는 방법은 예를 들어 기존 테이블 smple631에 NOT NULL 제약조건이 있던 c열의 제약조건을 없애는 방법은 아래 명령문과 같습니다.
ALTER TABLE sample631 MODIFY c VARCHAR(30);
mysql > ALTER TABLE sample631 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql > DESC sample631;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| no | int | NO | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
ALTER TABLE sample631 DROP CONSTRAINT pkey_sample631;
기본키로 설정할 열은 NOT NULL 및 UNIQUE 제약조건이 선행되어야 합니다.
따라서 기본키로 설정된 열이 NULL 값을 가지거나 중복하는 데이터 값을 가지면 제약에 위반됩니다.
아래와 같은 방법으로 만든 테이블 sample634가 존재한다고 가정해봅시다.
mysql > CREATE TABLE sample634 (
-> no INTEGER NOT NULL,
-> name VARCHAR(8),
-> CONSTRAINT pkey_sample634 PRIMARY KEY (no)
-> );
Query OK, 0 rows affected (0.01 sec)
INSERT INTO sample634 VALUES(1, '첫번째 행');
INSERT INTO sample634 VALUES(2, '두번째 행');
mysql > INSERT INTO sample634 VALUES(2, '중복된 행');
ERROR 1062 (23000): Duplicate entry '2' for key 'sample634.PRIMARY'
mysql > UPDATE sample634 SET no = 2 WHERE no = 1;
ERROR 1062 (23000): Duplicate entry '2' for key 'sample634.PRIMARY'
기본키 제약에는 이를 구성할 열 지정이 필요하며 이때 지정된 열은 NOT NULL 제약이 설정되어 있어야 합니다. 다시 말해 기본키로는 NULL 값이 허용되지 않습니다.
이때 기본키를 구성하는 열은 복수여도 무관합니다. 따라서 아래와 같이 a열과 b열이 모두 기본키인 테이블 sample635의 경우 하나의 열만 봤을 때는 중복되는 값이 존재하기 때문에 기본키 제약에 위반되지만 a열과 b열을 하나의 쌍으로 봤을 때는 (1, 1), (1, 2)와 같이 전부 중복되지 않는 쌍이기 때문에 기본키 제약에 위반되지 않습니다.
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
+---+---+