ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification ...]
alter_specification:
    ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
  | ADD [COLUMN] (create_definition, create_definition,...)
  | ADD INDEX [index_name] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
  | ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
  | ADD FULLTEXT [index_name] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
           [reference_definition]
  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  | CHANGE [COLUMN] old_col_name create_definition
           [FIRST | AFTER column_name]
  | MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
  | DROP [COLUMN] col_name
  | DROP PRIMARY KEY
  | DROP INDEX index_name
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] new_tbl_name
  | ORDER BY col
  | CHARACTER SET character_set_name [COLLATE collation_name]
  | table_options
        ALTER TABLE
        では、既存のテーブルの構造を変更することができます。
        たとえば、カラムの追加や削除、インデックスの作成や破壊、既存のカラムの型変更、カラム名やテーブル名自体の変更などの操作を実行できます。また、テーブルおよびテーブル型に関するコメントを変更することもできます。
      
        See 項6.5.3. 「CREATE TABLE 構文」。
      
        ALTER TABLE
        を使用してカラムの仕様を変更したにもかかわらず、カラムが変更されていないと
        DESCRIBE tbl_name
        で示された場合は、項6.5.3.1. 「カラムの暗黙的な変更」
        で挙げている理由のいずれかにより、変更が
        MySQL
        によって無視された可能性があります。たとえば、VARCHAR
        型のカラムを CHAR
        型に変更しようとしたときに、他の可変長カラムがテーブルにまだ含まれていると、このカラムに対しては
        VARCHAR
        型が引き続き使用されます。
      
        ALTER TABLE
        の処理では、元のテーブルの一時的なコピーが作成されます。
        変更はこのコピーに対して実行されます。その後元のテーブルが削除され、新しいテーブルの名前が変更されます。この変更処理は、すべての更新が、エラーになることなく、確実に新しいテーブルに自動でリダイレクトされるように実行されます。ALTER
        TABLE
        の実行中、元のテーブルは他のクライアントによって読み取り可能です。このテーブルの更新とテーブルへの書き込みは、新しいテーブルの準備が整うまで停止されます。
      
        注意: RENAME 以外のオプションを
        ALTER TABLE
        に指定した場合は、厳密にはデータをコピーする必要がないとき(カラム名の変更時など)でも、必ずテンポラリテーブルが
        MySQL
        によって作成されます。これについては今後修正する予定ですが、通常
        ALTER TABLE
        はそれほど頻繁に使用されないため、TODOリストにおけるこの修正の優先順位はそれほど高くありません。
        MyISAM
        テーブルについては、myisam_sort_buffer_size
        変数に高い値を設定することによって、インデックスの再作成部分(再作成プロセスでもっとも処理が遅い部分)を迅速化することができます。
      
            ALTER TABLE
            を使用するためには、対象のテーブルに対する
            ALTER、INSERT、CREATE
            の各権限が必要。
          
            IGNORE は SQL-92 に対する MySQL
            の拡張。 IGNORE
            では、重複するユニークキーが新しいテーブルに存在する場合の
            ALTER TABLE
            の動作が制御される。 IGNORE
            を指定しない場合は、コピー処理が中断され、ロールバックされる。
            IGNORE
            を指定すると、重複するユニークキーを持つレコードがある場合、最初のレコードのみが使用され、その他のレコードが削除される。
          
            1 つの ALTER TABLE
            ステートメントで、複数の
            ADD、ALTER、DROP、CHANGE
            節を発行できる。これは SQL-92 に対する MySQL
            の拡張。SQL-92 では、1 つの ALTER
            TABLE
            ステートメントでこれらのいずれか 1
            つの節しか使用できない。
          
            CHANGE col_name, DROP
            col_name と DROP INDEX は
            SQL-92 に対する MySQL の拡張。
          
            MODIFY は ALTER TABLE
            に対する Oracle の拡張。
          
            オプションの語 COLUMN
            は純粋なノイズワードであり、省略可能。
          
            その他のオプションを指定しないで
            ALTER TABLE tbl_name RENAME TO new_name
            を使用すると、単にテーブル
            tbl_name
            に対応するファイルの名前が MySQL
            によって変更される。テンポラリテーブルを作成する必要はない。
            See 項6.5.5. 「RENAME TABLE 構文」。
          
            create_definition
            節では、ADD および
            CHANGE 用に CREATE
            TABLE と同じ構文が使用される。注意:
            この構文には、カラム型だけでなく、カラム名が含まれる。
            See 項6.5.3. 「CREATE TABLE 構文」。
          
            カラム名の変更には、CHANGE old_col_name
            create_definition
            節を使用できる。この変更を行うには、元のカラム名と新しいカラム名を指定し、さらに現在のこのカラムの型を指定する。たとえば、INTEGER
            型のカラム a の名前を
            b
            に変更するには、次のようにする。
          
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
            CHANGE
            構文では、カラムの名前ではなく型を変更する場合にも、元のカラム名と新しいカラム名の両方を(たとえ同じであっても)指定する必要がある。
            次に例を示す。
          
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
            ただし、MySQL バージョン 3.22.16a
            以降では、MODIFY
            を使用することで、カラムの名前を変更することなく、カラムの型変更を実行できる。
          
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
            カラムの一部に関するインデックスがある場合(たとえば、VARCHAR
            型カラムの最初の 10
            文字のインデックスがある場合など)、CHANGE
            または MODIFY
            を使用してそのカラムを短縮するときには、カラムの長さを、インデックスが作成されている文字の数より短くすることはできない。
          
            CHANGE または
            MODIFY
            を使用してカラムの型を変更する際には、MySQL
            によって、新しい型へのデータの変換ができる限り実行される。
          
            MySQL バージョン 3.22
            以降では、FIRST または
            ADD ... AFTER col_name
            を使用して、テーブルレコード内の特定の位置にカラムを追加することができる。デフォルトでは、レコードの最後にカラムが追加される。
            MySQL バージョン 4.0.1
            以降では、CHANGE や
            MODIFY でも、FIRST
            および AFTER
            キーワードを使用できる。
          
            ALTER COLUMN
            では、カラムの新しいデフォルト値を指定するか、または以前のデフォルト値を削除できる。
            以前のデフォルトを削除した場合、そのカラムで
            NULL
            の格納が可能なら、新しいデフォルト値は
            NULL になる。そのカラムで
            NULL
            の格納が不可能な場合は、項6.5.3. 「CREATE TABLE 構文」
            で説明しているデフォルト値が MySQL
            によって割り当てられる。
          
            DROP INDEX
            では、インデックスが削除される。これは、SQL-92
            に対する MySQL の拡張。See
            項6.5.8. 「DROP INDEX 構文」。
          
カラムがテーブルから破棄された場合、そのカラムは構成要素となっているすべてのインデックスからも削除される。インデックスを構成するすべてのカラムが破棄された場合は、そのインデックス自体も破棄される。
            テーブルにカラムが 1
            つしか含まれない場合、そのカラムを破棄することはできない。
            テーブルの削除を実行することが目的である場合は、カラムを破棄するのではなく、DROP
            TABLE を実行する。
          
            DROP PRIMARY KEY
            では、プライマリインデックスが破棄される。プライマリインデックスが存在しない場合は、そのテーブルの最初の
            UNIQUE
            インデックスが破棄される(明示的に指定された
            PRIMARY KEY
            がまったく存在しない場合は、MySQL
            によって、最初の UNIQUE キーが
            PRIMARY KEY
            としてマークされる)。
          
            テーブルに UNIQUE INDEX または
            PRIMARY KEY
            を追加すると、その値は非
            UNIQUE
            なあらゆるインデックスの前に格納される。これは、MySQL
            で重複キーをできる限り迅速に検出できるようにするためである。
          
            ORDER BY
            では、レコードを特定の順序で並べた新しいテーブルを作成できる。注意:
            挿入や削除を行った後は、テーブル内の元の順序は維持されない。場合によっては、後でテーブル内の順序付けの基準とするカラムに基づいて、テーブル内の順序を設定しておくと、MySQL
            でのソートがより容易化されることがある。このオプションは主に、レコードのクエリをたいてい特定の順序で行うことが明らかな場合に役立つ。テーブルを大幅に変更した後にこのオプションを使用することによって、パフォーマンスが良くなる場合がある。
          
            MyISAM テーブルに対して
            ALTER TABLE
            を使用すると、非ユニークなインデックスのすべてが別のバッチに作成される(REPAIR
            の場合と同様)。
            インデックスが数多くある場合は、これによって
            ALTER TABLE
            の処理がはるかに迅速化される。
          
            MySQL 4.0
            以降では、上記の機能を明示的に有効化することができる。
            そのためには、ALTER TABLE ... DISABLE
            KEYS によって、MySQL による
            MyISAM
            テーブルの非ユニークなインデックスの更新を停止する。
            その後、ALTER TABLE ... ENABLE KEYS
            によって、欠落しているインデックスを再作成する。MySQL
            において、この処理は 1
            つずつキーを挿入する処理よりはるかに早い特殊アルゴリズムを使用して実行されるため、大量の挿入ではキーを無効化することによって処理が大幅に迅速化される。
          
            
            C API 関数 mysql_info()
            を使用すると、コピーされたレコードの数と、ユニークキー値の重複により削除されたレコードの数(IGNORE
            を指定した場合)を確認できる。
          
            
            
            ... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...)
            REFERENCES ... (...) と ... DROP FOREIGN
            KEY ... をサポートしている InnoDB
            型のテーブルを対象としている場合を除いて、FOREIGN
            KEY、CHECK、REFERENCES
            の各節では実際には何も行われない。 See
            項7.5.5.2. 「FOREIGN KEY 制約」。
            他のテーブル型に関しては、この構文は互換性を確保する目的で提供されている。つまり、他の
            SQL
            サーバにコードを移植し、参照を含むテーブルを作成するアプリケーションを実行しやすくするためである。
            See 項1.8.4. 「MySQL と SQL-92 との違い」。
          
            ALTER TABLE
            では、テーブルオプション DATA
            DIRECTORY と INDEX DIRECTORY
            は無視される。
          
CHAR 型、VARCHAR 型、TEXT 型のすべてのカラムを新しいキャラクタセットに変更するには(たとえば、MySQL 4.0.x から 4.1.1 にアップグレードした後などに)、次のようにする。
ALTER TABLE table_name CHARACTER SET character_set_name;
            注意: 次のコマンドでは、テーブルの
            default character set
            しか変更されない。
          
ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name;
            default character set
            とは、テーブルに追加する(ALTER TABLE
            ... ADD column
            などで)新しいカラムに対してキャラクタセットを指定しなかった場合に使用されるキャラクタセット。
          
        以下に、ALTER TABLE
        に使用例をいくつか示します。まず、次のコマンドでテーブル
        t1 を作成するとします。
      
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
        このテーブルの名前を t1 から
        t2
        に変更するには、次のようにします。
      
mysql> ALTER TABLE t1 RENAME t2;
        カラム a を INTEGER
        から TINYINT NOT NULL
        に変更し(名前は変えずに)、さらにカラム
        b を CHAR(10) から
        CHAR(20)
        に変更し、かつこのカラムの名前を
        b から c
        に変更するには、次のようにします。
      
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
        d という名前を持つ
        TIMESTAMP
        型の新しいカラムを追加するには、次のようにします。
      
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
        カラム d
        にインデックスを追加し、カラム
        a
        を主キーにするには、次のようにします。
      
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
        カラム c
        を削除するには、次のようにします。
      
mysql> ALTER TABLE t2 DROP COLUMN c;
        c
        という名前を持つ、整数型の新しい
        AUTO_INCREMENT
        カラムを追加するには、次のようにします。
      
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);
        注意: 上の例で c
        のインデックスを作成しているのは、AUTO_INCREMENT
        カラムにはインデックスが必要なためです。また、c
        を NOT NULL
        として宣言しているのは、インデックス付きカラムは値として
        NULL を取れないためです。
      
        AUTO_INCREMENT
        カラムを追加すると、カラム値として連続番号が自動的に挿入されます。最初の連続番号を設定するには、ALTER
        TABLE の前に SET INSERT_ID=value
        を実行するか、または
        AUTO_INCREMENT=value
        テーブルオプションを指定します。 See
        項5.5.6. 「SET 構文」。
      
        MyISAM テーブルでは、AUTO_INCREMENT
        カラムを変更しない限り、連続番号は影響されません。AUTO_INCREMENT
        カラムを破棄した後に別の
        AUTO_INCREMENT
        カラムを追加すると、再び 1
        から採番されます。
      
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

