13.1.7.3 ALTER TABLE의 예
다음과 같이 작성되는 테이블 t1 에서 시작합니다.
CREATE TABLE t1 (a INTEGER, b CHAR (10));
테이블의 이름을 t1 에서 t2 로 변경하려면 다음과 같이합니다.
ALTER TABLE t1 RENAME t2;
컬럼 a 를 INTEGER 에서 TINYINT NOT NULL 로 변경 (이름은 동일하게 유지합니다) 또한 열 b 를 CHAR(10) 에서 CHAR(20) 으로 변경하고, 그 이름을 b 에서 c 로 변경하려면 다음과 같이합니다.
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE bc CHAR (20);
d 라는 새로운 TIMESTAMP 컬럼을 추가하려면 다음과 같이합니다.
ALTER TABLE t2 ADD d TIMESTAMP;
컬럼 d 에 인덱스를 또한 컬럼 a 에 UNIQUE 인덱스를 추가하려면 다음과 같이합니다.
ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);
컬럼 c 를 삭제하려면 다음과 같이합니다.
ALTER TABLE t2 DROP COLUMN c;
c 라는 새로운 AUTO_INCREMENT 정수 컬럼을 추가하려면 다음과 같이합니다.
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (c);
AUTO_INCREMENT 컬럼에 인덱스를 설정해야하기 때문에 c 에 ( PRIMARY KEY 로) 인덱스를 설정하고 또한 프라이 머리 키 컬럼은 NULL 로 할 수 없기 때문에 c 를 NOT NULL 로 선언합니다.
NDB 테이블의 경우 테이블 또는 컬럼에 사용되는 저장 형식을 변경할 수 있습니다. 예를 들어, 다음과 같이 생성 된 NDB 테이블을 생각해 보겠습니다.
mysql> CREATE TABLE t1 (c1 INT) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.27 sec)
이 테이블을 디스크 기반 스토리지로 변환하려면 다음 ALTER TABLE 문을 사용할 수 있습니다.
mysql>ALTER TABLE t1 TABLESPACE ts_1 STORAGE DISK;Query OK, 0 rows affected (2.99 sec) Records : 0 Duplicates : 0 Warnings : 0 mysql>SHOW CREATE TABLE t1\G*************************** 1. row ******************** ******* Table : t1 Create Table : CREATE TABLE`t1` ( `c1` int (11) DEFAULT NULL ) / *! 50100 TABLESPACE ts_1 STORAGE DISK * / ENGINE = ndbcluster DEFAULT CHARSET = latin1 1 row in set (0.01 sec)
테이블을 처음 만들 때 테이블 스페이스가 참조되는 필요는 없지만, 테이블 스페이스는 ALTER TABLE 의해 참조 될 필요가 있습니다.
mysql>CREATE TABLE t2 (c1 INT) ts_1 ENGINE NDB;Query OK, 0 rows affected (1.00 sec) mysql>ALTER TABLE t2 STORAGE DISK;ERROR 1005 (HY000) : Can not create table 'c # sql-1750_3'(errno : 140) mysql>ALTER TABLE t2 TABLESPACE ts_1 STORAGE DISK;Query OK, 0 rows affected (3.42 sec) Records : 0 Duplicates : 0 Warnings : 0 mysql>SHOW CREATE TABLE t2\G*************************** 1. row ******************** ******* Table : t1 Create Table : CREATE TABLE`t2` ( `c1` int (11) DEFAULT NULL ) / *! 50100 TABLESPACE ts_1 STORAGE DISK * / ENGINE = ndbcluster DEFAULT CHARSET = latin1 1 row in set (0.01 sec)
각 컬럼의 저장 유형을 변경하려면 ALTER TABLE ... MODIFY [COLUMN] 를 사용할 수 있습니다. 예를 들어, 다음의 CREATE TABLE 문을 사용하여 2 개의 컬럼을 포함 MySQL Cluster 디스크 데이터 테이블을 만들려고합니다.
mysql>CREATE TABLE t3 (c1 INT, c2 INT)->TABLESPACE ts_1 STORAGE DISK ENGINE NDB;Query OK, 0 rows affected (1.34 sec)
컬럼 c2 를 디스크 기반의 스토리지에서 인 메모리 스토리지로 변경하려면 다음과 같이 ALTER TABLE 문에서 사용되는 열 정의에 STORAGE MEMORY 절을 포함합니다.
mysql> ALTER TABLE t3 MODIFY c2 INT STORAGE MEMORY;
Query OK, 0 rows affected (3.14 sec)
Records : 0 Duplicates : 0 Warnings : 0
같은 방법으로 STORAGE DISK 를 사용하여 인 메모리 컬럼을 디스크 기반의 컬럼 할 수 있습니다.
컬럼 c1 은 디스크 기반 스토리지를 사용합니다. 이것이 ( CREATE TABLE 문에서 테이블 수준 STORAGE DISK 절에 의해 결정되는) 테이블의 기본이기 때문입니다. 그러나 다음 SHOW CREATE TABLE 의 출력에 같이 컬럼 c2 는 인 메모리 스토리지를 사용합니다.
mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ******************** *******
Table : t3
Create Table : CREATE TABLE`t3` (
`c1` int (11) DEFAULT NULL,
`c2` int (11) / *! 50120 STORAGE MEMORY * / DEFAULT NULL
) / *! 50100 TABLESPACE ts_1 STORAGE DISK * / ENGINE = ndbcluster DEFAULT CHARSET = latin1
1 row in set (0.02 sec)
AUTO_INCREMENT 컬럼을 추가하면 컬럼 값에 자동으로 일련 번호가 입력됩니다. MyISAM 테이블의 경우 ALTER TABLE 의 전에 SET INSERT_ID= 를 실행하거나 valueAUTO_INCREMENT= 테이블 옵션을 사용하여 첫 번째 시퀀스 번호를 설정할 수 있습니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오. value
MyISAM 테이블에서 AUTO_INCREMENT 컬럼을 변경하지 않는 경우, 시퀀스 번호는 영향을받지 않습니다. AUTO_INCREMENT 컬럼을 제거하고 다른 AUTO_INCREMENT 컬럼을 추가하면 시퀀스 번호는 1부터 다시 지정됩니다.
복제가 사용되는 경우, 테이블에 AUTO_INCREMENT 컬럼을 추가하면 슬레이브와 마스터 행의 순서가 동일하지 않을 수 있습니다. 이것이 발생하는 것은 행이 번호 매기기 순서가 테이블에 사용되는 고유의 스토리지 엔진 및 행이 삽입 된 순서에 의존하기 때문입니다. 마스터와 슬레이브로 같은 순서를 가지는 것이 중요하다 경우 행을 정렬 한 AUTO_INCREMENT 번호를 할당해야합니다. 테이블 t1 에 AUTO_INCREMENT 컬럼을 추가한다고 가정하면 다음 명령문은 t1 과 동일하지만, AUTO_INCREMENT 컬럼을 포함하는 새 테이블 t2 을 생성합니다.
CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY) SELECT * FROM t1 ORDER BY col1, col2;
여기에서는 테이블 t1 에 열 col1 과 col2 가 존재하는 것을 전제로하고 있습니다.
이 일련의 명령문은 또한 t1 과 동일하지만, AUTO_INCREMENT 컬럼이 추가 된 새 테이블 t2 도 생성됩니다.
CREATE TABLE t2 LIKE t1; ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY; INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
마스터와 슬레이브로 순서가 동일 함을 보증하려면 ORDER BY 절에서 t1 의 모든 컬럼을 참조해야합니다.
AUTO_INCREMENT 컬럼을 가진 복사본을 만들고 채우는 데 사용하는 방법에 관계없이 마지막 단계는 원래 테이블을 삭제하고 복사본의 이름을 변경하는 것입니다.
DROP TABLE t1; ALTER TABLE t2 RENAME t1;