列の変更
列の変更は以下の3つの構文が利用可能ですが、構文によってできることが異なります。
ALTER TABLE テーブル名 ALTER [COLUMN] 列名 {SET DEFAULT デフォルト値 | DROP DEFAULT}
ALTER TABLE テーブル名 CHANGE [COLUMN] 古い列名 新しい列名 列の定義 [FIRST|AFTER 既存の列名]
ALTER TABLE テーブル名 MODIFY [COLUMN] 列名 列の定義 [FIRST | AFTER 既存の列名]
ALTERコマンドでは、既存の列のデフォルト値の変更またはデフォルト値の削除ができます。CHANGEコマンドでは列名の変更の他、データ型を含む定義を変更し、さらに列の移動もできます。MODIFYコマンドの場合には列名の変更以外はCHANGEコマンドと同じです。
データ型などの列の定義を変更した場合、既存の行の値も自動的に新しいデータ型に変更されるため、値がデータ型の範囲外にならないように注意が必要です。以下は人口を表す`Population`列をINT(11)からDECIMAL(11,2)に変更したため、人口が10億を超え、人口の表現に最低10桁の整数が必要な中国とインドのデータが正しくなくなっている例です。
mysql> ALTER TABLE mini_cont MODIFY Population DECIMAL(11,2); Query OK, 239 rows affected, 2 warnings (0.02 sec) Records: 239 Duplicates: 0 Warnings: 2 Warning (Code 1264): Out of range value for column 'Population' at row 72 Warning (Code 1264): Out of range value for column 'Population' at row 94 mysql> DESC mini_cont; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | Name | char(52) | NO | | | | | Population | decimal(11,2) | YES | | NULL | | +------------+---------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> SELECT * FROM mini_cont WHERE Name LIKE 'Ch%'; +------------------+--------------+ | Name | Population | +------------------+--------------+ | Chile | 15211000.00 | | Christmas Island | 2500.00 | | China | 999999999.99 | | Chad | 7651000.00 | +------------------+--------------+ 4 rows in set (0.01 sec)
インデックスの作成と削除
インデックスの作成にはALTER TABLE文およびCREATE INDEX文が使用できます。
ALTER TABLE テーブル名 ADD インデックスの種類 インデックス名 (インデックス対象列)
CREATE INDEX インデックス名 ON テーブル名 (インデックス対象列)
なおALTER TABLEを使用した場合は全てのインデックスが作成できるのに対し、CREATE TABLE文では主キーが作成できない制約があります。
インデックスの削除にはALTER TABLE文およびDROP INDEX文が使用できます。
ALTER TABLE テーブル名 DROP インデックス名
DROP INDEX インデックス名 ON テーブル名