13.1.7 ALTER TABLE 구문
- 13.1.7.1 ALTER TABLE 파티션 작업
- 13.1.7.2 MySQL Cluster에서 ALTER TABLE 온라인 조작
- 13.1.7.3 ALTER TABLE의 예
ALTER [ONLINE|OFFLINE] [IGNORE] TABLEtbl_name
[alter_specification
[,alter_specification
] ...] [partition_options
]alter_specification
:table_options
| ADD [COLUMN]col_name
column_definition
[FIRST | AFTERcol_name
] | ADD [COLUMN] (col_name
column_definition
,...) | ADD {INDEX|KEY} [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] PRIMARY KEY [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] UNIQUE [INDEX|KEY] [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD FULLTEXT [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | ADD SPATIAL [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] FOREIGN KEY [index_name
] (index_col_name
,...)reference_definition
| ALGORITHM [=] {DEFAULT|INPLACE|COPY} | ALTER [COLUMN]col_name
{SET DEFAULTliteral
| DROP DEFAULT} | CHANGE [COLUMN]old_col_name
new_col_name
column_definition
[FIRST|AFTERcol_name
] | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE} | MODIFY [COLUMN]col_name
column_definition
[FIRST | AFTERcol_name
] | DROP [COLUMN]col_name
| DROP PRIMARY KEY | DROP {INDEX|KEY}index_name
| DROP FOREIGN KEYfk_symbol
| DISABLE KEYS | ENABLE KEYS | RENAME [TO|AS]new_tbl_name
| ORDER BYcol_name
[,col_name
] ... | CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
] | [DEFAULT] CHARACTER SET [=]charset_name
[COLLATE [=]collation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE | FORCE | ADD PARTITION (partition_definition
) | DROP PARTITIONpartition_names
| TRUNCATE PARTITION {partition_names
| ALL} | COALESCE PARTITIONnumber
| REORGANIZE PARTITIONpartition_names
INTO (partition_definitions
) | EXCHANGE PARTITIONpartition_name
WITH TABLEtbl_name
| ANALYZE PARTITION {partition_names
| ALL} | CHECK PARTITION {partition_names
| ALL} | OPTIMIZE PARTITION {partition_names
| ALL} | REBUILD PARTITION {partition_names
| ALL} | REPAIR PARTITION {partition_names
| ALL} | REMOVE PARTITIONINGindex_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH}index_option
: KEY_BLOCK_SIZE [=]value
|index_type
| WITH PARSERparser_name
| COMMENT 'string
'table_options
:table_option
[[,]table_option
] ... (seeCREATE TABLE
options)partition_options
: (seeCREATE TABLE
options)
ALTER TABLE
은 테이블의 구조를 변경합니다. 예를 들어, 열을 추가 또는 삭제하거나 인덱스를 만들거나 삭제하거나 기존의 컬럼의 형태를 변경하거나 열 또는 테이블 자체의 이름을 변경할 수 있습니다. 또한 테이블에 사용되는 스토리지 엔진과 테이블의 댓글 등의 특성을 변경할 수 있습니다.
테이블 이름 다음에 변경 한 사항을 지정합니다. 아무것도 지정되어 있지 않은 경우, ALTER TABLE
아무것도하지 않습니다.
허용되는 많은 변화의 구문은 CREATE TABLE
문에 각 어구와 비슷합니다. 자세한 내용은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.
table_options
는 ENGINE
, AUTO_INCREMENT
, AVG_ROW_LENGTH
, MAX_ROWS
, ROW_FORMAT
같은 CREATE TABLE
문에서 사용할 수있는 종류의 테이블 옵션을 보여줍니다. 모든 테이블 옵션 목록과 각 옵션에 대한 설명은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오. 그러나 ALTER TABLE
은 DATA DIRECTORY
및 INDEX DIRECTORY
테이블 옵션을 무시합니다.
partition_options
은 다시 분할 파티션의 추가, 삭제, 병합 및 분할, 분할의 유지 관리 수행 등을 위해 파티션 된 테이블에서 사용할 수있는 옵션을 제공합니다. ALTER TABLE
문에는 다른 변경 지정 이외에 PARTITION BY
또는 REMOVE PARTITIONING
절을 포함 할 수 있지만 PARTITION BY
또는 REMOVE PARTITIONING
절은 다른 어떤 지정보다 앞으로의 마지막에 지정해야 있습니다. ADD PARTITION
, DROP PARTITION
, COALESCE PARTITION
, REORGANIZE PARTITION
, EXCHANGE PARTITION
, ANALYZE PARTITION
, CHECK PARTITION
및 REPAIR PARTITION
옵션은 개별 파티션에 대해 작동하므로 하나의 ALTER TABLE
내에서 다른 변경 지정과 함께 수 없습니다. 파티션 옵션의 자세한 내용은 섹션 13.1.17 "CREATE TABLE 구문」 및 섹션 13.1.7.1 "ALTER TABLE 파티션 작업" 을 참조하십시오. ALTER TABLE ... EXCHANGE PARTITION
문의 자세한 내용 및 예제는 섹션 19.3.1 "RANGE 및 LIST 파티션 관리" 를 참조하십시오.
작업은 스토리지 엔진이 해당 작업을 지원하지 않는 테이블에 시도하면 경고가 생성 될 수 있습니다. 이러한 경고는 SHOW WARNINGS
에서 볼 수 있습니다. 섹션 13.7.5.41 "SHOW WARNINGS 구문" 을 참조하십시오.
ALTER TABLE
의 문제 해결 내용은 섹션 B.5.7.1 "ALTER TABLE의 문제" 를 참조하십시오.
스토리지 성능 및 동시성 고려 사항
대부분의 경우 ALTER TABLE
은 원본 테이블의 임시 복사본을 만듭니다. MySQL은 테이블을 변경하고 다른 작업을 기다렸다가 처리를 계속합니다. 그 카피로 변경을 내장 원래의 테이블을 삭제 한 후 새 테이블의 이름을 변경합니다. ALTER TABLE
의 실행 중, 다른 세션은 원래의 테이블을 읽을 수 있습니다 (예외는 곧 나중에 설명합니다). ALTER TABLE
작업이 시작된 후 시작 된 테이블에 대한 업데이트 및 쓰기는 새로운 테이블의 준비가 될 때까지 정지 된 후 어떤 업데이트도 실패하지 않고 새 테이블로 자동으로 리디렉션됩니다. 원래 테이블의 임시 복사본은 새 테이블의 데이터베이스 디렉토리에 생성됩니다. 이것은 테이블의 이름을 다른 데이터베이스에 변경 ALTER TABLE
조작에 대한 원래의 테이블의 데이터베이스 디렉토리와 다를 수 있습니다.
앞에서 언급 한 예외는 ALTER TABLE
이 테이블의 .frm
파일의 새 버전을 설치하고 오래된 파일을 삭제하고 테이블 및 테이블 정의 캐시에서 오래된 테이블 구조를 클리어 할 준비가되면 로 (쓰기뿐만 아니라) 읽기를 차단하는 것입니다. 이 시점에서,이 문은 배타적 락을 취득해야합니다. 그것을 위해 현재의 읽기 측이 완료 될 때까지 기다렸다가 새 읽기 (및 쓰기)을 차단합니다.
MyISAM
테이블의 경우 myisam_sort_buffer_size
시스템 변수를 큰 값으로 설정하여 인덱스를 다시 작성 (변경 프로세스의 가장 느린 부분)을 가속화 할 수 있습니다.
일부 작업은 임시 테이블을 필요로하지 않는 적절한 ALTER TABLE
이 가능합니다.
ALTER TABLE
을 다른 옵션없이 실행하면 MySQL은 단순히 사본을 작성하지 않고 테이블tbl_name
RENAME TOnew_tbl_name
tbl_name
에 해당하는 모든 파일의 이름을 변경합니다. (RENAME TABLE
문을 사용하여 테이블의 이름을 변경할 수도 있습니다. 섹션 13.1.32 "RENAME TABLE 구문" 을 참조하십시오.) 이름 변경된 테이블 전용으로 부여 된 권한은 아무도 새로운 이름으로 마이그레이션되지 않습니다. 그들은 수동으로 변경해야합니다.서버가 변경할 필요가있는 것은 테이블의 내용이 아닌 테이블의
.frm
파일뿐이기 때문에 테이블 데이터를 변경하지 않고 테이블 메타 데이터 만 변경하는 변경 사항은 즉시 실행됩니다. 다음의 변경은이 방법으로 실행할 수있는 신속한 변경입니다.컬럼 이름 변경. 그러나 MySQL 5.6.6 이전의
InnoDB
스토리지 엔진을 제외합니다.컬럼의 기본값 변경 (
NDB
테이블을 제외합니다. " MySQL Cluster 온라인 조작의 제한 "을 참조하십시오).유효한 멤버 값 목록의 마지막에 새로운 열거 나 세트 구성원을 추가 할에 따르면,
ENUM
또는SET
컬럼의 정의를 변경합니다. 그러나 데이터 형 스토리지 크기가 변경되는 경우를 제외합니다. 예를 들어, 회원 수가 8SET
컬럼에 구성원을 추가하면 값마다 필요한 스토리지가 1 바이트에서 2 바이트로 변경됩니다. 여기에는 테이블 복사본이 필요합니다. 목록 중간에 멤버를 추가하면 기존 멤버의 번호가 변경됩니다. 여기에는 테이블 복사본이 필요합니다.
ADD PARTITION
,DROP PARTITION
,COALESCE PARTITION
,REBUILD PARTITION
또는REORGANIZE PARTITION
을 포함ALTER TABLE
임시 테이블을 생성하지 않습니다 (NDB
테이블에서 사용되는 경우를 제외). 그러나 이러한 작업은 임시 파티션 파일이 생성됩니다.RANGE
또는LIST
파티션에 대한ADD
또는DROP
조작은 즉시 작업하거나 거의 즉시 작업입니다.HASH
또는KEY
파티션에 대한ADD
또는COALESCE
작업은LINEAR HASH
또는LINEAR KEY
가 사용되지 않는 한, 모든 파티션간에 데이터가 복사됩니다.ADD
또는COALESCE
작업은 파티션마다 실행됩니다 만, 이것은 실질적으로 새로운 테이블을 만드는 것과 같습니다.REORGANIZE
작업은 변경된 파티션 만 복사되고 변경되지 않은 것은 그대로입니다.인덱스의 이름 변경.
InnoDB
를 제외합니다.InnoDB
및NDB
대한 인덱스의 추가 또는 삭제.
old_alter_table
시스템 변수를 ON
으로 설정하거나 alter_specification
절 중 하나로 ALGORITHM=COPY
를 지정하여 보통이면 테이블 복사를 필요로하지 않는 ALTER TABLE
조작으로 강제로 (MySQL 5.0에서 지원 있다) 임시 테이블의 방법을 사용하도록 할 수 있습니다. old_alter_table
설정과 DEFAULT
이외의 값을 가지는 ALGORITHM
절 사이에 모순이있는 경우 ALGORITHM
절이 우선합니다. ( ALGORITHM = DEFAULT
는 ALGORITHM
절을 전혀 지정하지 않는 것과 동일합니다.)
ALGORITHM=INPLACE
을 지정하면 그것을 지원하는 어구 및 스토리지 엔진에 적절한 방법이 사용되게되고, 지원되지 않을 경우 오류와 함께 실패합니다. 따라서 예측하고 있던 것과 다른 스토리지 엔진을 사용하는 테이블을 변경하고자하는 경우 매우 긴 테이블 복사를 방지 할 수 있습니다. InnoDB
테이블에 대한 온라인 DDL 내용은 섹션 14.11 "InnoDB와 온라인 DDL" 를 참조하십시오.
MySQL 5.6.16에서는 ALTER TABLE
은 ADD COLUMN
, CHANGE COLUMN
, MODIFY COLUMN
, ADD INDEX
및 FORCE
조작에 대해 이전 시간 컬럼을 5.6 형식으로 업그레이드합니다. 테이블을 재구성해야하므로이 변환은 INPLACE
알고리즘을 사용하여 수행 할 수 없습니다. 따라서 이러한 경우 ALGORITHM=INPLACE
를 지정하면 오류가 발생합니다. 필요하다면 ALGORITHM=COPY
를 지정합니다.
MySQL 5.6.22에서 테이블을 KEY
를 파티션하는 데 사용되는 멀티 컬럼 인덱스에 대한 ALTER TABLE
작업이 작업은 컬럼의 순서가 변경 될 경우 온라인으로 수행 할 수 없습니다. 이런 경우는 대신 복사 ALTER TABLE
을 사용해야합니다. (Bug # 17896265)
MySQL Cluster는 온라인 ALTER TABLE
조작도 지원하고 있습니다 만, ALGORITHM=INPLACE
구문을 허용하지 않으므로 대신 ONLINE
키워드가 사용됩니다. ONLINE
및 OFFLINE
키워드는 MySQL Cluster에서만 지원됩니다. 이러한 키워드는 MySQL Cluster NDB 7.3에서 비추천입니다. MySQL Cluster NDB 7.4에서 계속 지원되지만 이후 버전의 MySQL Cluster에서 삭제 될 수 있습니다. 정확한 구문 및 기타 자세한 내용은 섹션 13.1.7.2 "MySQL Cluster에서 ALTER TABLE 온라인 작업" 을 참조하십시오.
LOCK
절을 사용하면 변경중인 테이블의 병렬 읽기 및 쓰기 수준을 제어 할 수 있습니다. 이 절에 기본값이 아닌 값을 지정하면 변경 작업 중에 특정 양의 병렬 액세스 또는 배타성이 요구되게 할 수 있으며, 요구 된 수준 잠금을 사용할 수없는 경우 작업을 중지 됩니다. LOCK
절 매개 변수는 다음과 같습니다.
LOCK = DEFAULT
지정된
ALGORITHM
절 (있는 경우) 및ALTER TABLE
조작에 대한 최대 수준의 병렬성 : 지원되는 경우, 병렬 읽기 및 쓰기를 허용합니다. 그렇지 않은 경우, 지원되는 경우는 병렬 읽기를 허용합니다. 그렇지 않은 경우는 배타적 액세스를 적용합니다.LOCK = NONE
지원되는 경우, 병렬 읽기 및 쓰기를 허용합니다. 그렇지 않은 경우, 오류 메시지를 반환합니다.
LOCK = SHARED
지원되는 경우, 병렬 읽기를 허용하지만 쓰기는 차단합니다. 쓰기는 지정된
ALGORITHM
절 (있는 경우) 및ALTER TABLE
조작에 대해 병렬 쓰기가 스토리지 엔진에 의해 지원되는 경우에도 차단됩니다. 병렬 읽기를 지원하지 않으면 오류 메시지를 반환합니다.LOCK = EXCLUSIVE
배타적 액세스를 적용합니다. 이것은 지정된
ALGORITHM
절 (있는 경우) 및ALTER TABLE
조작에 대해 병렬 읽기 / 쓰기가 스토리지 엔진에 의해 지원되는 경우에도 실행됩니다.
MySQL 5.6.3의 시점에서는 ALTER TABLE
를 사용하여 테이블을 재구성하는 "null"변경 작업을 수행 할 수 있습니다. 이전에는 tbl_name
FORCEFORCE
옵션은 인식했지만 무시되었습니다. MySQL 5.6.17 시점에서는 온라인 DDL 지원 FORCE
옵션에 대해 제공됩니다. 자세한 내용은 섹션 14.11.1 "온라인 DDL 개요" 를 참조하십시오.
NDB
테이블의 경우 가변 폭 컬럼에 인덱스를 추가 및 제거 작업은 대부분의 기간 테이블 복사를 행하거나 병렬 DML 작업을 차단할 수없이 온라인으로 실행됩니다. 섹션 13.1.7.2 "MySQL Cluster에서 ALTER TABLE 온라인 작업" 을 참조하십시오.
사용상의주의
ALTER TABLE
을 사용하려면이 테이블에 대한ALTER
,CREATE
및INSERT
권한이 필요합니다. 테이블 이름을 변경하려면 기존 테이블 측에서ALTER
및DROP
과 새로운 테이블 측에서ALTER
,CREATE
및INSERT
권한이 필요합니다.IGNORE
는 표준 SQL에 대한 MySQL 확장입니다. 이것은 새로운 테이블의 고유 키에 대해 중복이 존재하거나 엄격 모드가 활성화되어있을 때 경고가 발생한 경우ALTER TABLE
의 동작을 제어합니다.IGNORE
가 지정되어 있지 않은 경우, 중복 키 오류가 발생하면 복사가 중단되고 롤백됩니다.IGNORE
가 지정되어있는 경우, 고유 키가 중복 된 행 중 한 행만 사용됩니다. 기타 충돌하는 행은 삭제됩니다. 잘못된 값은 가장 가까운 일치하는 허용 가능한 값으로 잘립니다.MySQL 5.6.17 시점에서는
IGNORE
절은 비추천이며, 사용하면 경고가 생성됩니다. MySQL 5.7에서는IGNORE
은 삭제됩니다.테이블에 쓰기 잠겨있을 때, 그 테이블 구조를 변경하기 위해
ALTER TABLE
을 사용하면 보류중인INSERT DELAYED
명령문은 손실됩니다.table_option
는ENGINE
,AUTO_INCREMENT
,AVG_ROW_LENGTH
,MAX_ROWS
,ROW_FORMAT
같은CREATE TABLE
문에서 사용할 수있는 종류의 테이블 옵션을 보여줍니다. 모든 테이블 옵션 목록과 각 옵션에 대한 설명은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오. 그러나ALTER TABLE
은DATA DIRECTORY
및INDEX DIRECTORY
테이블 옵션을 무시합니다.예를 들어, 테이블을
InnoDB
테이블이되도록 변환하려면 다음 문을 사용합니다.ALTER TABLE t1 ENGINE = InnoDB;
테이블을
InnoDB
스토리지 엔진에 전환 할 때의 고려 사항은 섹션 14.6.4 "MyISAM에서 InnoDB의 테이블 변환" 을 참조하십시오.ENGINE
절을 지정하면ALTER TABLE
은 테이블을 재구성합니다. 이것은 그 테이블에 지정된 스토리지 엔진이 이미 존재하는 경우에도 마찬가지입니다.기존의
InnoDB
테이블에서ALTER TABLE
을 실행하면 "null"tbl_name
ENGINE=INNODBALTER TABLE
작업이 수행됩니다. 이것은 섹션 14.10.4 "테이블의 조각" 에 설명 된 바와 같이,InnoDB
테이블의 조각 모음에 사용할 수 있습니다.InnoDB
테이블에 대한ALTER TABLE
를 실행해도 동일한 기능을 수행합니다.tbl_name
FORCEMySQL 5.6.17 시점에서는
ALTER TABLE
와tbl_name
ENGINE=INNODBALTER TABLE
모두 온라인 DDL (tbl_name
FORCEALGORITHM=COPY
)를 사용합니다. 자세한 내용은 섹션 14.11.1 "온라인 DDL 개요" 를 참조하십시오.테이블의 스토리지 엔진을 변경하려고하면 섹션 5.1.7 "서버 SQL 모드" 에 설명 된대로 그 결과는 목적의 스토리지 엔진을 사용할 수 있는지 여부와
NO_ENGINE_SUBSTITUTION
SQL 모드의 설정에 의해 영향을받지 합니다.데이터가 실수로 손실되는 일이 없도록
ALTER TABLE
을 사용하여 테이블의 스토리지 엔진을MERGE
또는BLACKHOLE
에 변경할 수 없습니다.새로운 행에 사용되는
AUTO_INCREMENT
카운터의 값을 변경하려면 다음과 같이합니다.ALTER TABLE t2 AUTO_INCREMENT =
value
;이 카운터를 현재 사용되는 값 이하의 값으로 재설정 할 수 없습니다.
InnoDB
와MyISAM
의 두 경우 모두이 값이 현재AUTO_INCREMENT
컬럼에있는 최대 값 이하인 경우,이 값은 현재AUTO_INCREMENT
컬럼의 최대 값에 1을 더한 값으로 재설정됩니다.하나의
ALTER TABLE
문에서 쉼표로 구분 된 여러ADD
,ALTER
,DROP
및CHANGE
절을 실행할 수 있습니다. 이것은ALTER TABLE
문마다 각 어구가 1 개 밖에 허용되지 않는 표준 SQL에 대한 MySQL 확장입니다. 예를 들어, 하나의 문에서 여러 열을 삭제하려면 다음과 같이합니다.ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE
,col_name
DROP
및col_name
DROP INDEX
는 표준 SQL에 대한 MySQL 확장입니다.워드
COLUMN
는 옵션이며 생략 할 수 있습니다.column_definition
절은ADD
와CHANGE
대해CREATE TABLE
에서와 동일한 구문을 사용합니다. 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.CHANGE
절을 사용하여 컬럼의 이름을 변경할 수 있습니다. 그렇게 오래된 컬럼 명으로 새로운 컬럼 이름 및 컬럼의 현재의 정의를 지정합니다. 예를 들어,old_col_name
new_col_name
column_definition
INTEGER
컬럼의 이름을a
에서b
로 변경하려면 다음과 같이 할 수 있습니다.ALTER TABLE t1 CHANGE ab INTEGER;
컬럼의 이름을 변경하지 않고, 그 형태를 변경하려면 이전 컬럼 명으로 새로운 컬럼 이름이 같은 경우에도
CHANGE
구문에 그 이름이 계속 필요합니다. 예 :ALTER TABLE t1 CHANGE bb BIGINT NOT NULL;
MODIFY
를 사용하여 컬럼의 이름을 변경하지 않고, 그 형태를 변경할 수 있습니다.ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
MODIFY
은 Oracle 호환성에 대한ALTER TABLE
에 대한 확장입니다.CHANGE
또는MODIFY
을 사용하는 경우column_definition
데이터 형 및PRIMARY KEY
나UNIQUE
등의 인덱스 속성 이외의 새로운 컬럼에 적용되는 모든 속성을 포함해야합니다. 원래 정의는 존재하지만, 새로운 정의로 지정되어 있지 않은 속성은 유지되지 않습니다. 컬럼col1
가INT UNSIGNED DEFAULT 1 COMMENT 'my column'
로 정의되어있을 때,이 컬럼을 다음과 같이 변경합니다.ALTER TABLE t1 MODIFY col1 BIGINT;
결과 컬럼은
BIGINT
로 정의되지만, 속성UNSIGNED DEFAULT 1 COMMENT 'my column'
은 포함되지 않습니다. 이를 유지하려면 문을 다음과 같이하십시오.ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
CHANGE
또는MODIFY
을 사용하여 데이터 형식을 변경하면, MySQL은 기존의 컬럼 값을 새로운 형태로 가능한 변환하려고합니다.경고이 변환에 의해 데이터가 변경 될 수 있습니다. 예를 들어, 문자열 컬럼을 줄이면 값이 잘릴 수 있습니다. 새로운 데이터 형식으로 변환하여 데이터가 손실 될 경우 작업이 성공하지 않도록하려면
ALTER TABLE
을 사용하기 전에 엄격한 SQL 모드를 활성화합니다 ( 섹션 5.1.7 "서버 SQL 모드" 를 참조 하십시오).테이블 행의 특정 위치에 컬럼을 추가하려면
FIRST
또는AFTER
을 사용합니다. 기본적으로 그 컬럼을 마지막에 추가합니다. 또한col_name
CHANGE
또는MODIFY
작업FIRST
및AFTER
를 사용하여 테이블의 컬럼을 정렬 할 수 있습니다.ALTER ... SET DEFAULT
또는ALTER ... DROP DEFAULT
는 각 컬럼의 새로운 디폴트 값을 지정하거나 기존 기본값을 삭제합니다. 이전 기본이 삭제되고, 또한 컬럼을NULL
에있는 경우 새 기본값은NULL
입니다. 컬럼을NULL
로 할 수없는 경우, MySQL은 섹션 11.6 "데이터 유형 기본값" 에 설명 된대로 기본값을 할당합니다.DROP INDEX
는 인덱스를 제거합니다. 이것은 표준 SQL에 대한 MySQL 확장입니다. 섹션 13.1.24 "DROP INDEX 구문" 을 참조하십시오. 인덱스 이름에 확신이없는 경우는SHOW INDEX FROM
을 사용합니다.tbl_name
테이블에서 열이 삭제 된 경우, 그 컬럼은 그것이 포함하는 모든 인덱스에서 제거됩니다. 인덱스를 구성하는 모든 컬럼이 삭제 된 경우 해당 인덱스도 삭제됩니다.
CHANGE
또는MODIFY
을 사용하여 인덱스가 존재하는 컬럼을 짧게 한 때 결과 열의 길이가 인덱스의 길이보다 짧아 진 경우, MySQL은 자동으로 인덱스를 짧게합니다.테이블에 하나의 컬럼 만 포함되지 않은 경우 해당 컬럼을 삭제할 수 없습니다. 테이블을 삭제하는 것이 목적이면, 대신
DROP TABLE
을 사용합니다.DROP PRIMARY KEY
는 기본 키 를 제거합니다. 기본 키가 존재하지 않으면 오류가 발생합니다. 기본 키의 성능 특성 (특히InnoDB
테이블의 경우) 내용은 섹션 8.3.2 "기본 키 사용" 을 참조하십시오.테이블에
UNIQUE INDEX
또는PRIMARY KEY
을 추가하면 중복 키를 최대한 빨리 찾을 수 있도록하기 위해 MySQL은 그것을 고유하지 않은 어떤 인덱스 이전에 저장합니다.일부 스토리지 엔진은 인덱스를 만들 때 인덱스 유형을 지정할 수 있습니다.
index_type
지정자 구문은USING
입니다.type_name
USING
대한 자세한 내용은 섹션 13.1.13 "CREATE INDEX 구문" 을 참조하십시오. 권장되는 위치는 컬럼리스트의 나머지입니다. 이 옵션을 컬럼리스트의 전에 사용하기위한 지원은 미래의 MySQL 릴리스에서 제거 될 예정입니다.index_option
값은 인덱스의 추가 옵션을 지정합니다.USING
그런 옵션 중 하나입니다. 허용되는index_option
값의 자세한 내용은 섹션 13.1.13 "CREATE INDEX 구문" 을 참조하십시오.ALTER TABLE
문 뒤에 인덱스 중요도 정보를 업데이트하기 위해ANALYZE TABLE
을 실행해야 할 수 있습니다. 섹션 13.7.5.23 "SHOW INDEX 구문" 을 참조하십시오.ORDER BY
를 사용하면 특정 순서로 행이 포함 된 새 테이블을 만들 수 있습니다. 이 옵션은 주로 대부분은 특정 순서로 행을 쿼리하는 것을 알고 있으면 도움이됩니다. 이 옵션을 테이블의 대폭적인 변경 후 사용하면 성능 향상을 얻을 수있을 수 있습니다. 경우에 따라서는 테이블이 나중에 정렬하는 데 사용하는 컬럼마다의 순서로되어 있으면, MySQL에서의 정렬이 쉽게 될 수 있습니다.참고삽입하거나 제거 할 때이 테이블은 지정된 순서 그대로는 없습니다.
ORDER BY
구문에서는 정렬을위한 컬럼 이름을 하나 이상 지정할 수 있습니다. 그 각 열 이름 뒤에 선택적으로 각각 오름차순 또는 내림차순 정렬 순서를 나타내는ASC
또는DESC
를 지정할 수 있습니다. 기본값은 오름차순입니다. 정렬 조건으로 허용되는 것은 컬럼 명뿐입니다. 어떤 표현은 허용되지 않습니다. 이 절은 다른 어떤 조항보다 앞으로의 마지막에 지정하도록하십시오.InnoDB
는 항상 클러스터 된 인덱스 에 따라 테이블 행을 정렬,ORDER BY
는InnoDB
테이블에서는 의미가 없습니다.참고파티션 된 테이블에 사용되는 경우
ALTER TABLE ... ORDER BY
는 각 파티션에서만 행을 정렬합니다.MyISAM
테이블에 대한ALTER TABLE
을 사용하면 고유하지 않은 인덱스는 모든 (REPAIR TABLE
로) 다른 배치에 작성됩니다. 많은 인덱스가있을 때이 방법으로ALTER TABLE
가 훨씬 빨라집니다.MyISAM
테이블의 경우 키의 업데이트를 명시 적으로 제어 할 수 있습니다.ALTER TABLE ... DISABLE KEYS
를 사용하여 고유하지 않은 인덱스의 업데이트를 중지하도록 MySQL에 지시합니다. 다음은ALTER TABLE ... ENABLE KEYS
를 사용하여 누락 된 인덱스를 다시 작성합니다.MyISAM
은 이것을 키를 하나씩 삽입하는 것에 비해 훨씬 빠른 특수 알고리즘으로 수행하기 위해 대량 삽입 작업을 수행하기 전에 키를 비활성화하면 상당한 속도를 얻을 수 있습니다.ALTER TABLE ... DISABLE KEYS
를 사용하려면 먼저 언급 한 권한과 함께INDEX
권한이 필요합니다.고유하지 않은 인덱스가 비활성화되어있는 동안 유효한 경우는이 인덱스를 사용하는
SELECT
와EXPLAIN
등의 문에서 무시됩니다.MySQL 5.6.7 이전 버전에서는
ALTER TABLE
을 사용하여 foreign 키 컬럼의 정의를 변경하면 참조 무결성이 손실 될 수있었습니다. 예를 들어,NULL
값을 포함한 외부 키 컬럼을NOT NULL
이되도록 변경하면NULL
값이 빈 문자열이되었습니다. 마찬가지로 부모 테이블에서 행을 삭제하는ALTER TABLE IGNORE
의해 참조 무결성이 손상 될 수있었습니다.5.6.7의 시점에서는 참조 무결성이 손실 될 수있는 foreign 키 컬럼에 변경이 서버에 의해 금지되어 있습니다. 또한 안전하지 않을 수있는 이러한 열의 데이터 형식으로 변경도 금지됩니다. 예를 들어,
VARCHAR (20)
의VARCHAR (30)
에 대한 변경은 허용되지만 그것을VARCHAR (1024)
로 변경하는 것은이를 통해 개별 값을 저장하는 데 필요한 바이트 수가 변경 되므로 허용되지 않습니다. 해결 방법으로 컬럼 정의를 변경하기 전에ALTER TABLE ... DROP FOREIGN KEY
를 사용하고 나중에ALTER TABLE ... ADD FOREIGN KEY
를 사용합니다.FOREIGN KEY
및REFERENCES
절은ADD [CONSTRAINT [
를 구현하고있는symbol
]] FOREIGN KEY [index_name
(...) REFERENCES ... (...)InnoDB
및NDB
스토리지 엔진에 의해 지원됩니다. 섹션 14.6.6 "InnoDB와 FOREIGN KEY 제약 조건" 을 참조하십시오. 다른 스토리지 엔진은이 어구는 해석되지만 무시됩니다.CHECK
절은 모든 스토리지 엔진에 의해 해석되지만 무시됩니다. 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오. 구문 절을 수락하지만 무시하는 이유는 호환성 때문입니다. 즉, 다른 SQL 서버에서 코드를 이식 참조로 테이블을 만드는 응용 프로그램을 실행하는 것을 용이하게하기 때문입니다. 섹션 1.8.2 "MySQL 표준 SQL과의 차이점" 을 참조하십시오.ALTER TABLE
에서는CREATE TABLE
과 달리ADD FOREIGN KEY
는index_name
(지정된 경우)를 무시하고 자동으로 생성 된 외래 키 이름을 사용합니다. 해결 방법으로 외래 키 이름을 지정CONSTRAINT
절을 포함합니다.ADD CONSTRAINT
name
FOREIGN KEY (....) ...중요참조가 열 지정의 일부로 정의 된 인라인
REFERENCES
지정은 암묵적으로 무시됩니다. MySQL은 개별FOREIGN KEY
지정의 일부로 정의 된REFERENCES
절만을 받아들입니다.참고파티션 된
InnoDB
테이블은 외래 키를 지원하지 않습니다. 이 제한은NDB
테이블 ([LINEAR] KEY
에 의해 명시 적으로 분할 된 테이블을 포함)에 적용되지 않습니다. 자세한 내용은 섹션 19.6.2 "스토리지 엔진 관련 파티셔닝 제한" 을 참조하십시오.InnoDB
및NDB
스토리지 엔진은 외래 키를 삭제하는ALTER TABLE
의 사용을 지원합니다.ALTER TABLE
tbl_name
DROP FOREIGN KEYfk_symbol
;자세한 내용은 섹션 14.6.6 "InnoDB와 FOREIGN KEY 제약 조건" 을 참조하십시오.
MySQL 5.6.6 이전에는 동일한
ALTER TABLE
문에서 외부 키의 추가 및 삭제는 문제가 발생할 수 있기 때문에 지원되지 않습니다. 작업에 대해 별도의 문을 사용하도록하십시오. MySQL 5.6.6의 시점에서는 동일한ALTER TABLE
문에서 외부 키의 추가 및 삭제는ALTER TABLE ... ALGORITHM = INPLACE
에서 지원되지만ALTER TABLE ... ALGORITHM = COPY
에서는 지원되지 않는 상태입니다..ibd
파일의 고유 테이블 스페이스에서 작성된InnoDB
테이블의 경우 해당 파일을 삭제하거나 가져올 수 있습니다..ibd
파일을 삭제하려면 다음 문을 사용합니다.ALTER TABLE
tbl_name
DISCARD TABLESPACE;따라서 현재의
.ibd
파일이 삭제되므로 먼저 백업이 있는지 확인하십시오. 테이블 공간 파일이 삭제되는 동안 테이블의 내용을 변경하려고하면 오류가 발생합니다. 테이블 공간 파일이 삭제되는 동안 섹션 14.11 "InnoDB와 온라인 DDL" 에 표시된 DDL 작업을 수행 할 수 있습니다.백업
.ibd
파일을 원래의 테이블에 가져 오려면 그것을 데이터베이스 디렉토리에 복사 한 다음 문을 실행합니다.ALTER TABLE
tbl_name
IMPORT TABLESPACE;테이블 공간 파일은 반드시 나중에 가져올 서버에 생성되어있을 필요는 없습니다. MySQL 5.6에서는 테이블 스페이스 파일의 다른 서버에서 가져 오기 기능하는 두 서버의 상태가 GA (General Availablility)이자 그 버전이 같은 시리즈에있는 경우입니다. 그렇지 않은 경우, 그 파일은 가져올 서버에 생성되어 있어야합니다.
참고ALTER TABLE ... IMPORT TABLESPACE
기능은 가져온 데이터에 외부 키 제약 조건을 부과하지 않습니다.섹션 14.5.2 "InnoDB File-Per-Table 모드" 를 참조하십시오.
테이블의 기본 문자 세트 및 모든 문자 컬럼 (
CHAR
,VARCHAR
,TEXT
)을 새로운 캐릭터 세트로 변경하려면 다음과 같은 명령문을 사용합니다.ALTER TABLE
tbl_name
CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
];이 문은 모든 문자 열의 데이터 정렬 변경됩니다. 사용하는 데이터 정렬을 나타내는
COLLATE
절을 지정하지 않으면이 문은 문자 집합의 기본 데이터 정렬을 사용합니다. 이 데이터 정렬을 목적으로하는 테이블 사용에 적합하지 않습니다 (예를 들어, 대문자와 소문자가 구별되는 데이터 정렬에서 대소 문자를 구분하지 않는 데이터 정렬로 변경되어 버리는 경우), 데이터 정렬을 명시 적으로 지정 합니다.데이터 유형이
VARCHAR
또는 하나의TEXT
형인 컬럼에 대해CONVERT TO CHARACTER SET
은 새로운 컬럼이 확실히 원래 열만큼의 문자를 저장할 수있는 충분한 길이가되도록, 필요에 따라 데이터 형식을 변경합니다. 예를 들어,TEXT
컬럼은 그 컬럼의 값의 바이트 (최대 65,535)를 저장하기위한 2 바이트가 있습니다.latin1
TEXT
컬럼의 경우 각 문자에 1 바이트가 필요하므로,이 컬럼은 최대 65,535 문자를 저장할 수 있습니다. 이 컬럼이utf8
로 변환 된 경우 각 문자에 최대 3 바이트가 필요할 수 있기 때문에 수있는 최대 길이는 3 × 65,535 = 196,605 바이트입니다. 그 길이는TEXT
컬럼 바이트에 맞지 않기 때문에 MySQL은 데이터 형식을 바이트에 196,605의 값을 기록 할 수있는 최소의 문자열 인MEDIUMTEXT
로 변환합니다. 마찬가지로,VARCHAR
컬럼은MEDIUMTEXT
로 변환 될 가능성이 있습니다.지금 설명한 형태의 데이터 형식 변경을 방지하려면
CONVERT TO CHARACTER SET
을 사용하지 마십시오. 대신MODIFY
를 사용하여 개별 컬럼을 변경합니다. 예 :ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8; ALTER TABLE t MODIFY latin1_varchar_col VARCHAR (
M
) CHARACTER SET utf8;CONVERT TO CHARACTER SET binary
를 지정했을 경우,CHAR
,VARCHAR
및TEXT
컬럼은 각각 대응하는 이진 문자열 (BINARY
,VARBINARY
,BLOB
)로 변환됩니다. 즉,이 컬럼에는 문자 세트가 포함되지 않으므로 이후CONVERT TO
조작은 적용되지 않습니다.charset_name
이DEFAULT
인 경우, 데이터베이스 문자 세트가 사용됩니다.경고CONVERT TO
작업은 문자 집합 사이에서 컬럼 값을 변환합니다. 이것은 문자 세트 (latin1
등)의 컬럼이 있지만 저장된 값이 실제로는 다른 어떠한 호환되지 않는 문자 집합 (utf8
등)를 사용하는 경우에 필요한 것이 아닙니다 . 이 경우 이러한 컬럼에 대해 다음을 수행해야합니다.ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
이것이 기능하는 이유는
BLOB
컬럼 사이의 변환하면 변환이 발생하지 않기 때문입니다.테이블의 기본 문자 집합 만 변경하려면 다음 문을 사용합니다.
ALTER TABLE
tbl_name
DEFAULT CHARACTER SETcharset_name
;워드
DEFAULT
는 옵션입니다. 기본 문자 집합은 나중에 (예를 들어,ALTER TABLE ... ADD column
에서) 테이블에 추가 할 컬럼의 문자 세트를 지정하지 않은 경우에 사용되는 문자 집합입니다.
mysql_info ()
C API 함수를 사용하면 ALTER TABLE
에 의해 복사 된 행 수와 ( IGNORE
를 사용하는 경우) 고유 키 값의 중복을 위해 삭제 된 행 수를 확인할 수 있습니다. 섹션 23.8.7.35 "mysql_info ()" 를 참조하십시오.