ALTER [ONLINE | OFFLINE] [IGNORE] TABLEtbl_namealter_specification[,alter_specification] ...alter_specification:table_options| ADD [COLUMN]col_namecolumn_definition[FIRST | AFTERcol_name] | ADD [COLUMN] (col_namecolumn_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| ALTER [COLUMN]col_name{SET DEFAULTliteral| DROP DEFAULT} | CHANGE [COLUMN]old_col_namenew_col_namecolumn_definition[FIRST|AFTERcol_name] | MODIFY [COLUMN]col_namecolumn_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]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 |partition_options| ADD PARTITION (partition_definition) | DROP PARTITIONpartition_names| COALESCE PARTITIONnumber| REORGANIZE PARTITION [partition_namesINTO (partition_definitions)] | ANALYZE PARTITIONpartition_names| CHECK PARTITIONpartition_names| OPTIMIZE PARTITIONpartition_names| REBUILD PARTITIONpartition_names| REPAIR PARTITIONpartition_names| REMOVE PARTITIONINGindex_col_name:col_name[(length)] [ASC | DESC]index_type: USING {BTREE | HASH | RTREE}index_option: KEY_BLOCK_SIZE [=]value|index_type| WITH PARSERparser_name| COMMENT 'string'table_options:table_option[[,]table_option] ...
        ALTER TABLE
        で既存テーブルの構造を変更することができます。たとえば、カラムの追加や削除、インデックスの作成や破壊、既存カラム型の変更、またはカラムやテーブル自体の名前の変更をすることができます。テーブルや、テーブル型のコメントを変更することもできます。
      
        多くの許容される変更の構文は、CREATE
        TABLE
        ステートメントの節に似ています。詳細については、項8.1.17. 「CREATE TABLE 構文」
        を参照してください。
      
        ストレージエンジンがその操作をサポートしていないテーブルに対しては、いくつかの操作の結果は警告になってしまうかもしれません。これらの警告は
        SHOW WARNINGS
        で表示することができます。項8.5.5.42. 「SHOW WARNINGS 構文」
        を参照してください。
      
        ほとんどの場合、ALTER
        TABLE
        は元テーブルの一時コピーを作成することで起動します。そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。ALTER
        TABLE
        が実行されている間、元のテーブルをほかのセッションから読み取ることができます。新しいテーブルの準備ができるまで更新と書き込みは止められ、その後更新に失敗することなく新しいテーブルに自動的にリダイレクトされます。一時テーブルは、新しいテーブルのデータベースディレクトリに作成されます。ALTER
        TABLE
        がテーブルの名前を別のデータベースに変更している場合、このデータベースディレクトリは元のテーブルと異なっていてもかまいません。
      
一時テーブルが必要ない場合がいくつかあります。
            テーブルデータを変更せず、テーブルメタデータのみを変更する変更は、テーブルコンテンツを変更せず、テーブルの
            .frm
            ファイルを変更することによってただちに実行できます。次の変更は、この方法で迅速に実行できます。
          
カラムまたはインデックスの名前の変更。
カラムのデフォルト値の変更。
                有効なメンバー値のリストの最後に新しい列挙またはセットメンバーを追加することによる、ENUM
                または
                SET
                カラムの定義の変更。
              
            場合によっては、VARCHAR(10)
            カラムの VARCHAR(15)
            への変更などの操作が即座に実行されることもありますが、これはテーブルのストレージエンジンによって異なります。VARCHAR(10)
            を 255 を超える長さにするといった変更は、1
            バイトを使用して長さを格納していたものを
            2
            バイトを使用するようにデータ値を変更する必要があるため、即座には実行されません。
          
            ALTER TABLE
            
            をほかのオプションを指定せずに使用すると、MySQL
            は単純に、テーブル
            tbl_name RENAME TO
            new_tbl_nametbl_name
            に対応するすべてのファイルの名前を変更します。(テーブルをリネームするために
            RENAME TABLE
            ステートメントを利用することもできます。項8.1.33. 「RENAME TABLE 構文」
            を参照してください。)
            リネームされたテーブルに与えられた権限は、新しい名前に移動しません。それらは手動で変更しなければいけません。
          
            ALTER TABLE ...ADD
            PARTITION は MySQL
            クラスタ以外に一時テーブルを作成しません。RANGE
            や LIST
            パーティションの
            ADD や
            DROP
            操作は直接の操作、またはそれに近い操作です。HASH
            または KEY
            パーティションに対する
            ADD または
            COALESCE
            操作によって、変更されたパーティション間でデータがコピーされます。LINEAR
            HASH または LINEAR
            KEY
            が使用されていないかぎり、これは新しいテーブルの作成とほぼ同じです
            (ただし、操作はパーティションごとに実行される)。REORGANIZE
            操作は変更されたパーティションだけをコピーし、変更されていないものには関係しません。
          
        そうでない場合、データのコピーが厳密には必要でなくても、MySQL
        は一時テーブルを作成します。MyISAM
        テーブルは、高い値に
        myisam_sort_buffer_size
        システム変数を設定することで、インデックスの再作成操作のスピードを上げることができます。(これは変更プロセスの中で一番遅い操作です)。
      
        old-alter-table を
        ON
        に設定することによって、強制的に
        ALTER TABLE 操作で (MySQL
        5.0 でサポートされている)
        一時テーブルの方法が使用されるようにすることができます。
      
        ALTER TABLE
        のトラブルシューティングについては、Problems with ALTER TABLE
        を参照してください。
      
            ALTER TABLE
            を利用するには、テーブルに
            ALTER、INSERT、そして
            CREATE
            権限が必要です。
          
            MySQL 5.1.7 からは、ADD
            INDEX および
            DROP INDEX
            操作は、インデックスが可変幅カラム上にある場合のみオンラインで実行されます。
          
            MySQL Cluster NDB 6.2.5 および MySQL Cluster NDB 6.3.3
            からは、ONLINE
            キーワードを使用して、NDBCLUSTER
            テーブルに対する ADD
            COLUMN、ADD
            INDEX (CREATE
            INDEX ステートメントを含む)、および
            DROP INDEX
            操作をオンラインで実行できます。また、NDBCLUSTER
            テーブルのオンラインでの名前の変更もサポートされます。
          
            現在、ディスクベースのカラムは
            NDBCLUSTER
            テーブルにオンラインで追加できません。つまり、テーブルレベルの
            STORAGE DISK
            オプションを使用する
            NDBCLUSTER
            テーブルにインメモリーカラムを追加する場合は、メモリーベースのストレージを使用するとして新しいカラムを明示的に宣言する必要があります。たとえば、テーブル領域
            ts1
            をすでに作成していて、テーブル
            t1
            を次のように作成するとします。
          
mysql>CREATE TABLE t1 (>c1 INT NOT NULL PRIMARY KEY,>c2 VARCHAR(30)>)>TABLESPACE ts1 STORAGE DISK>ENGINE NDBCLUSTER;Query OK, 0 rows affected (1.73 sec) Records: 0 Duplicates: 0 Warnings: 0
次に示すように、新しいインメモリーカラムをこのテーブルにオンラインで追加できます。
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY;
Query OK, 0 rows affected (1.25 sec)
Records: 0  Duplicates: 0  Warnings: 0
            STORAGE MEMORY
            オプションが省略されている場合、このステートメントは失敗します。
          
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC;
ERROR 1235 (42000): This version of MySQL doesn't yet support
'ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC'
            COLUMN_FORMAT DYNAMIC
            オプションを省略した場合は、動的なカラム形式が自動的に使用されますが、次に示すような警告が発行されます。
          
mysql>ALTER ONLINE TABLE t1 ADD COLUMN c3 INT STORAGE MEMORY;Query OK, 0 rows affected, 1 warning (1.17 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1478 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` varchar(30) DEFAULT NULL, `c3` int(11) /*!50120 STORAGE MEMORY */ /*!50120 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, `t4` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL, PRIMARY KEY (`c1`) ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.03 sec)
            MySQL Cluster NDB 6.2.17、6.3.23、および 6.4.3
            より前のバージョンでは、テーブルレベルまたはカラムレベルの
            STORAGE DISK
            オプションを使用して作成されたテーブルへのインメモリーカラムの追加が正しく機能しませんでした。(Bug#42549)
          
            また、MyISAM
            のテーブルやカラムの名前をオンラインで変更することもできます。ただし、MyISAM
            テーブルのカラムまたはインデックスを追加または削除する操作で
            ONLINE
            を使用することはできません。
          
            オンライン操作はコピーなしです。つまり、インデックスを再作成する必要はありません。また、変更されているテーブルから
            MySQL Cluster 内のほかの API
            ノードへのアクセスもロックされません
            (ただし、この節のあとの方にある「制限」を参照)。
            このような操作では、複数の API
            ノードを含むクラスタ内で実行される
            NDBCLUSTER
            テーブルの変更に対して単一ユーザーモードは必要ありません。オンラインの
            DDL
            操作中、トランザクションは中断されずに続行できます。
          
            また、MySQL Cluster NDB 7.0
            では、NDBCLUSTER
            テーブルに対してステートメント
            ALTER ONLINE TABLE ... REORGANIZE
            PARTITION を
            partition_names
            INTO
            (partition_definitions)
            MySQL Cluster NDB 6.4.3
            より前のバージョンでは、partition_names
            INTO
            (partition_definitions)ALTER ONLINE TABLE ... REORGANIZE
            PARTITION
            は、ディスクデータテーブル、または 1
            つ以上のディスクベースのカラムを含むインメモリーの
            NDBCLUSTER
            テーブルでは正しく機能しませんでした。(Bug#42549)
          
            ONLINE および
            OFFLINE
            キーワードは、MySQL Cluster NDB 6.2、6.3、7.0
            (バージョン 6.2.5、6.3.3、および 6.4.0
            から)、および以降の MySQL Cluster
            リリースシリーズでのみサポートされています。MySQL
            のほかのバージョンの場合 (5.1.17 以降):
            
                  ADD INDEX または
                  DROP
                  INDEX
                  操作をオンラインまたはオフラインで実行できる
                  (また、これらの操作がオンラインまたはオフラインで実行される)
                  かどうかは、サーバーによって自動的に決定されます。カラムのデータ型が可変幅の場合、これらの操作はオンラインで実行されます。これに関するサーバーの動作をオーバーライドすることはできません。
                
                  ALTER
                  TABLE ステートメントで
                  ONLINE または
                  OFFLINE
                  キーワードを使用しようとすると、エラーが発生します。
                
制限. 
              カラムを追加するオンラインの
              ALTER TABLE
              操作は、次の制限に従います。
              
                    変更されているテーブルは、オンラインの
                    ALTER
                    TABLE、ADD
                    COLUMN、CREATE
                    INDEX、または
                    DROP INDEX
                    ステートメントが実行されている以外の
                    API
                    ノードに関してはロックされません。ただし、オンライン操作が実行されている間、このテーブルは同じ
                    API
                    ノードから発信されているほかのすべての操作に対してロックされます。
                  
                    変更されるテーブルには、明示的な主キーが存在する必要があります。NDBCLUSTER
                    ストレージエンジンによって作成された隠し主キーは、この目的には不十分です。オンラインで追加されるカラムは、次の条件を満たしている必要があります。
                  
                        このようなカラムは動的である必要があります。つまり、COLUMN_FORMAT
                        DYNAMIC
                        を使用して作成できる必要があります。
                      
                        このようなカラムは NULL
                        にできる必要があり、かつ
                        NULL
                        以外の明示的なデフォルト値を持っていてはいけません。オンラインで追加されるカラムは、次に示すように、DEFAULT
                        NULL
                        として自動的に作成されます。
                      
mysql>CREATE TABLE t1 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY>) ENGINE=NDBCLUSTER;Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1>ADD COLUMN c2 INT,>ADD COLUMN c3 INT;Query OK, 0 rows affected, 2 warnings (0.93 sec) mysql>SHOW CREATE TABLE t2\G*************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
                        カラムは、既存のカラムのあとに追加する必要があります。既存のカラムが存在する前にオンラインでカラムを追加しようとすると、ステートメントがエラーで失敗します。また、FIRST
                        キーワードを使用してオンラインでカラムを追加しようとした場合も失敗します。
                      
さらに、既存のテーブルカラムをオンラインで並べ替えることはできません。
テーブルで使用されるストレージエンジンをオンラインで変更することはできません。
前の制限は、テーブルまたはカラムの名前を変更するだけの操作には適用されません。
                    ストレージエンジンがオンラインの
                    ALTER
                    TABLE
                    をサポートしている場合は、次に示すように、オンラインでカラムが追加されるとき、またはオンラインでインデックスが作成または削除されるときに、固定形式のカラムが動的形式に変換されます。
                  
mysql>CREATE TABLE t1 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY>) ENGINE=NDBCLUSTER;Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT;Query OK, 0 rows affected, 2 warnings (0.93 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 2 rows in set (0.00 sec)
既存のカラム (テーブルの主キーを含む) は、動的である必要はありません。動的である必要があるのは、オンラインで追加されるカラムだけです。
mysql>CREATE TABLE t2 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED>) ENGINE=NDBCLUSTER;Query OK, 0 rows affected (2.10 sec) mysql>ALTER ONLINE TABLE t2 ADD COLUMN c2 INT;Query OK, 0 rows affected, 1 warning (0.78 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
                    名前の変更操作によって、カラムが
                    FIXED から
                    DYNAMIC
                    のカラム形式に変換されることはありません。COLUMN_FORMAT
                    の詳細については、項8.1.17. 「CREATE TABLE 構文」
                    を参照してください。
                  
                    オンラインの DROP
                    COLUMN
                    操作はサポートされていません。
                  
                    特定のオンライン
                    ALTER
                    TABLE
                    では、ADD
                    COLUMN、ADD
                    INDEX、DROP
                    INDEX のいずれか 1
                    つのみを使用できます。1
                    つのステートメントで、1
                    つ以上のカラムをオンラインで追加できます。1
                    つのステートメントで、1
                    つのインデックスのみをオンラインで作成または削除できます。
                  
            KEY、CONSTRAINT、および
            IGNORE
            キーワードは、ONLINE
            キーワードを使用する
            ALTER TABLE
            ステートメントでサポートされます。
          
            また、MyISAM
            テーブルのカラムの名前を変更する
            ALTER TABLE ... CHANGE
            ...
            ステートメントでは、ONLINE
            および OFFLINE
            キーワードもサポートされます。
          
            IGNORE
            はスタンダード SQL の MySQL
            拡張子です。これは、新しいテーブルのユニークキーに複製があったり、厳密モードが有効時に警告が出たりしたときに
            ALTER TABLE
            がどのように機能するかコントロールします。もし
            IGNORE
            が指定されなければ、重複キーエラーが起きたとき、コピーは異常終了し、元に戻されます。もし
            IGNORE
            が指定されると、ユニークキーに複製された行の、最初の行だけが使用され、それ以外の相反する行は削除されます。不正な値は、適合する許容値に一番近い値まで切り捨てられます。
          
            table_option
            は、ENGINE、AUTO_INCREMENT、AVG_ROW_LENGTH
            などの、CREATE
            TABLE
            ステートメントで使用できる種類のテーブルオプションを示します。(項8.1.17. 「CREATE TABLE 構文」
            は、すべてのテーブルオプションを示しています。)
            しかし、ALTER
            TABLE は DATA
            DIRECTORY と INDEX
            DIRECTORY
            テーブルオプションを無視します。
          
            たとえば、テーブルが
            InnoDB
            テーブルになるように変換するには、このステートメントを利用します。
          
ALTER TABLE t1 ENGINE = InnoDB;
            テーブルのストレージエンジンを変更しようとすると、Server SQL Modes
            で説明されているように、その結果は目的のストレージエンジンが使用可能かどうかと、NO_ENGINE_SUBSTITUTION
            SQL モードの設定によって影響されます。
          
            MySQL 5.1.11
            では、不注意なデータロスを防ぐために、テーブルのストレージエンジンを
            MERGE や
            BLACKHOLE
            を変更するときに ALTER
            TABLE を利用することはできません。
          
            AUTO_INCREMENT
            カウンタを新しい行で使用するように値を変えるためには、次を実行してください。
          
ALTER TABLE t2 AUTO_INCREMENT = value;
            すでに使用されている値と同じ、またはそれ以下の値にカウンタをリセットすることはできません。MyISAM
            では、AUTO_INCREMENT
            カラム内の値が現在の最高値と同じかそれ以下の値なら、その値は現在の最高値プラス
            1
            にリセットされます。InnoDB
            では、この値がカラム内の現在の最大値より小さい場合、エラーは発生せず、現在のシーケンス値は変更されません。
          
            単一 ALTER TABLE
            ステートメントの中で、カンマで区切られた複数の
            ADD、ALTER、DROP、そして
            CHANGE
            節を発行することができます。これは、1
            つの ALTER
            TABLE ステートメントに対して 1
            つの節しか許可しない、スタンダード SQL の
            MySQL
            拡張子です。たとえば、単一ステートメントに複数のカラムをドロップするには、これを実行してください。
          
ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
            CHANGE、col_nameDROPそして
            col_nameDROPINDEX
            はスタンダード SQL の MySQL 拡張子です。
          
            MODIFY は
            ALTER TABLE
            のオラクル拡張子です。
          
            COLUMN
            という言葉は任意であり、省くことができます。
          
            column_definition 節は
            CREATE TABLE
            と同じように、ADD
            と CHANGE
            に同じ構文を利用します。項8.1.17. 「CREATE TABLE 構文」
            を参照してください。
          
            CHANGE
            
            節を使用して、カラムの名前を変更できます。それを行うには、カラムの古い名前と新しい名前、および現在そのカラムに設定されている定義を指定します。たとえば、old_col_name
            new_col_name
            column_definitionINTEGER
            カラムを a から
            b
            にリネームするには、次のように実行します。
          
ALTER TABLE t1 CHANGE a b INTEGER;
            もしカラム名ではなくカラム型を変更したければ、CHANGE
            構文には、両方同じだとしても古いカラム名と新しいカラム名が必要です。例
            :
          
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
            リネームせずにカラム型を変更するには、MODIFY
            を利用することもできます。
          
ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
            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
              モードを有効にします
              (Server SQL Modes を参照)。
            
            テーブル行内の特定の位置にカラムを追加するには、FIRST
            または AFTER
            
            を使用します。デフォルトはカラムを最後に追加します。また、col_nameCHANGE
            または MODIFY
            操作で FIRST と
            AFTER
            を使用して、テーブル内のカラムを並べ替えることもできます。
          
            
            
            
            
            
            ALTER ... SET DEFAULT
            または ALTER ... DROP
            DEFAULT
            は、それぞれ、カラムの新しいデフォルト値を指定するか、または古いデフォルト値を削除します。もし古いデフォルトが削除されて、カラムが
            NULL
            になり得るなら、新しいデフォルトは
            NULL
            です。カラムを
            NULL
            にできない場合は、項6.1.4. 「データ型デフォルト値」
            で説明されているように、MySQL
            によってデフォルト値が割り当てられます。
          
            
            
            
            DROP INDEX
            はインデックスを削除します。これはスタンダード
            SQL の MySQL
            拡張子です。詳しくは項8.1.24. 「DROP INDEX 構文」を参照してください。インデックス名に確信がない場合は、SHOW
            INDEX FROM 
            を使用します。
          tbl_name
            もしカラムがテーブルからドロップされると、そのカラムが関わっているすべてのインデックスからも削除されます。もし
            1
            つのインデックスを構成しているすべてのカラムがドロップされると、そのインデックスもドロップされます。インデックスを持つカラムを短くするために
            CHANGE や
            MODIFY
            を利用し、その結果カラム長がインデックス長よりも短くなるなら、MySQL
            はインデックスを自動的に短くします。
          
            もしテーブルがカラムを 1
            つだけ含んでいると、そのカラムはドロップできません。もしテーブルを削除したいのであれば、代わりに
            DROP TABLE
            を利用してください。
          
            
            
            
            DROP PRIMARY KEY
            は主キーを削除します。主キーが存在しない場合は、エラーが発生します。
          
            テーブルに UNIQUE
            INDEX または PRIMARY
            KEY を追加すると、MySQL
            が重複キーをできるだけ早く検出できるように、一意でないインデックスの前に格納されます。
          
            いくつかのストレージエンジンでは、インデックスを作成するときに型を指定することができます。index_type
            指定子の構文は USING
            
            です。type_nameUSING
            の詳細については、項8.1.13. 「CREATE INDEX 構文」
            を参照してください。MySQL 5.1.10
            以前では、USING
            はインデックスカラムリストの前だけに与えることができました。5.1.10
            以降のバージョンでの望ましい位置は、カラムリストの後ろです。このオプションをカラムリストの前で使用すると、将来の
            MySQL リリースでは認識されなくなります。
          
            index_option
            値はインデックスの追加オプションを指定します。USING
            はそのようなオプションの 1 つです。許容
            index_option
            値の詳細に関しては 項8.1.13. 「CREATE INDEX 構文」
            を参照してください。
          
            ALTER TABLE
            ステートメントのあとに、インデックスカーディナリティー情報を更新するために
            ANALYZE TABLE
            の実行が必要になることがあります。項8.5.5.23. 「SHOW INDEX 構文」
            を参照してください。
          
            
            ORDER BY
            を使用すると、特定の順序で行が含まれる新しいテーブルを作成できます。挿入と削除のあとではテーブルの順番が変わってしまうことを覚えておいてください。このオプションは、ほとんど毎回同じ順番で行のクエリーを行う場合に便利です。テーブルに大きい変更を行ったあとにこのオプションを利用すると、高い性能を得ることが可能でしょう。テーブルが、あとでカラムをオーダーしたい順番になっていれば、MySQL
            のソートは簡単になる場合があります。
          
            ORDER BY
            構文は、ソートの昇順や降順を指示するために、それぞれが任意で
            ASC または
            DESC が付随する 1
            つか 2
            つのカラム名を指定できます。デフォルトは昇順です。カラム名だけがソート基準として許されていて、任意の式は許されていません。
          
            ORDER BY
            は、ユーザー定義のクラスタ化されたインデックス
            (PRIMARY KEY または
            NOT NULL UNIQUE
            インデックス) を含む
            InnoDB
            テーブルでは意味がありません。このようなインデックスが存在する場合、InnoDB
            は、常にそのインデックスに従ってテーブル行を並べ替えます。
          
              パーティション化されたテーブルに対して使用されている場合、ALTER
              TABLE ... ORDER BY
              は、各パーティション内でのみ行を並べ替えます。
            
            
            
            
            MyISAM
            テーブルに対して
            ALTER TABLE
            を使用した場合、一意でないインデックスはすべて
            (REPAIR TABLE
            として)
            別のバッチに作成されます。多くのインデックスがあるときは、この方法で
            ALTER TABLE
            が大変早くなります。
          
            この機能は、MyISAM
            テーブルに対して明示的に有効にすることができます。ALTER
            TABLE ... DISABLE KEYS
            は、一意でないインデックスの更新を停止するよう
            MySQL
            に通知します。次に、ALTER
            TABLE ... ENABLE KEYS
            を使用して、欠けているインデックスを再作成するようにしてください。MySQL
            は、キーを 1 つ 1
            つ挿入するよりも大変早い特別なアルゴリズムを利用してこの作業を行いますので、大量挿入を行う前にキーを無効化しておくことでかなりのスピードアップを実現することができます。ALTER
            TABLE ... DISABLE KEYS
            を使用するには、先に説明した権限に加えて
            INDEX
            権限が必要です。
          
            一意でないインデックスは、無効になっている間、有効なときにはこのインデックスを使用する
            SELECT や
            EXPLAIN
            などのステートメントで無視されます。
          
            ENABLE KEYS と
            DISABLE KEYS は、MySQL
            5.1.11
            より前のバージョンではパーティション化されたテーブルに対してサポートされていませんでした。
          
            InnoDB
            テーブルに対する
            ALTER TABLE
            によって
            (たとえば、カラムが切り詰められたために)
            カラム値が変更された場合、InnoDB
            の FOREIGN KEY
            制約チェックでは、値の変更によって発生する可能性のある違反を認識できません。
          
            
            
            FOREIGN KEY および
            REFERENCES
            節は、ADD [CONSTRAINT
            [ を実装する
            symbol]] FOREIGN KEY (...)
            REFERENCES ... (...)InnoDB
            ストレージエンジンでサポートされます。詳しくは項9.4.4. 「FOREIGN KEY 制約」を参照してください。その他のストレージエンジンでは、節は解析されますが、無視されます。CHECK
            節は、すべてのストレージエンジンに解析されますが、無視されます。詳しくは項8.1.17. 「CREATE TABLE 構文」を参照してください。構文を受け入れながらも無視するのは、別の
            SQL
            サーバーからコードをポートし易くし、参照を利用してテーブルを作成するアプリケーションを起動させるという、互換性のためです。MySQL Differences from Standard SQL
            を参照してください。
          
              参照がカラム仕様の一部として定義されているインラインの
              REFERENCES
              仕様は、InnoDB
              によって暗黙のうちに無視されます。InnoDB
              は、個別の FOREIGN
              KEY
              仕様の一部として定義されている
              REFERENCES
              節のみを受け入れます。
            
パーティション化されたテーブルは外部キーをサポートしません。詳細については、Restrictions and Limitations on Partitioning を参照してください。
            
            
            
            InnoDB
            は、外部キーを削除するための
            ALTER TABLE
            の使用をサポートします。
          
ALTER TABLEtbl_nameDROP FOREIGN KEYfk_symbol;
            詳細は 項9.4.4. 「FOREIGN KEY 制約」
            をご覧ください。
          
            単一 ALTER
            TABLE
            ステートメントの別々の節の中に外部キーを追加したりドロップしたりはできません。別々のステートメントを利用しなければいけません。
          
            
            
            .ibd
            ファイル内の独自のテーブル領域を使用して作成された
            InnoDB
            テーブルでは、そのファイルを破棄したり、インポートしたりすることができます。.ibd
            ファイルを廃棄するためには、このステートメントを利用してください。
          
ALTER TABLE tbl_name DISCARD TABLESPACE;
            これは現在の .ibd
            ファイルを削除しますので、まずバックアップがあることを確認してください。テーブル領域ファイルが廃棄されている最中にテーブルにアクセスしようとすると、エラーが発生します。
          
            .ibd
            のバックアップファイルをインポートするためには、まずそれをデータベースディレクトリにコピーし、そしてこのステートメントを発行してください。
          
ALTER TABLE tbl_name IMPORT TABLESPACE;
項9.2.1. 「Per-Table テーブル領域を利用する」 を参照してください。
            テーブルが書き込みロックされ、ALTER
            TABLE
            がテーブル構造を変更するのに利用されると、保留中の
            INSERT
            DELAYED
            ステートメントは失われてしまいます。
          
            
            テーブルのデフォルトキャラクタセットとすべての文字カラム
            (CHAR、VARCHAR、TEXT)
            を新しいキャラクタセットに変更する場合は、次のようなステートメントを使用します。
          
ALTER TABLEtbl_nameCONVERT TO CHARACTER SETcharset_name;
            VARCHAR
            のデータ型、またはいずれかの
            TEXT
            型のカラムの場合、CONVERT
            TO CHARACTER SET
            では、新しいカラムが元のカラムと同じ文字数を格納できるだけの十分な長さになるようにするために、必要に応じてデータ型を変更します。たとえば、TEXT
            カラムは 2
            バイトの長さを持っており、カラムには最大
            65,535
            バイトまでの長さの値が格納されます。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
              操作は、キャラクタセットの間でカラム値を変換します。もし
              1
              つのキャラクタセット内にカラムを持つが
              (latin1
              等)、格納値は実際には別の互換性のないキャラクタセット
              (utf8 等)
              を利用しているという場合には、これは
              必要ではありません。このような場合は、それぞれのカラムに対して次のような作業が必要になります。
            
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
              BLOB
              カラムへの、またはそれからの変換時には変換が起きないため、これが有効なのです。
            
テーブルの default キャラクタセットだけを変更するには、このステートメントを利用してください。
ALTER TABLEtbl_nameDEFAULT CHARACTER SETcharset_name;
            DEFAULT
            という言葉は任意です。あとで
            (たとえば、ALTER TABLE ... ADD
            column を使用して)
            テーブルに追加するカラムのキャラクタセットを指定しない場合、使用されるキャラクタセットはデフォルトキャラクタセットになります。
          
            MySQL 5.1.5
            では、パーティション分割関連のいくつかの拡張機能が
            ALTER TABLE
            に追加されました。これらをパーティション化されたテーブルで使用すると、再パーティション化したり、パーティションを追加、削除、マージ、および分割したり、パーティション分割の保守を実行したりすることができます。
          
            そのまま partition_options
            節をパーティション化されたテーブル上で
            ALTER TABLE
            と共に利用すると、partition_options
            によって定義された分割スキーマに従って、そのテーブルを再分割します。この節は必ず
            PARTITION BY
            で始まり、CREATE
            TABLE の
            partition_options
            節に適応するのと同様で、同じ構文と別の規則が後に続きます。(さらに詳細な説明については
            項8.1.17. 「CREATE TABLE 構文」
            を参照してください)。また、まだ分割されていない既存テーブルの分割に利用することもできます。たとえば、次に示すように定義された
            (パーティション化されていない)
            テーブルを考えてみます。
          
CREATE TABLE t1 (
    id INT,
    year_col INT
);
            このテーブルは id
            カラムを分割キーとして利用し、HASH
            によって、このステートメントを用いて、8
            区画に分割することができます。
          
ALTER TABLE t1
    PARTITION BY HASH(id)
    PARTITIONS 8;
            ALTER TABLE ... PARTITION
            BY
            ステートメントを利用して作成されたテーブルは、CREATE
            TABLE ... PARTITION BY
            を利用して作成されたものと同じ規則に従わなければいけません。これには、Partitioning Keys, Primary Keys, and Unique Keys
            で説明されているように、テーブルに含まれている可能性のある任意のユニークキー
            (任意の主キーを含む)
            の関係を管理する規則と、パーティション分割式で使用されているカラムが含まれます。パーティションの数を指定するための
            CREATE TABLE ... PARTITION
            BY 規則は、ALTER
            TABLE ... PARTITION BY にも適用されます。
          
            ALTER TABLE ... PARTITION
            BY は MySQL 5.1.6
            から利用可能になりました。
          
            ALTER TABLE ADD PARTITION
            に対する partition_definition
            節は、CREATE
            TABLE
            ステートメントに対する同じ名前の節と同じオプションをサポートします。(構文と説明に関しては
            項8.1.17. 「CREATE TABLE 構文」
            を参照してください)。ここに表示されているように、分割済のテーブルが作成されていると仮定します。
          
CREATE TABLE t1 (
    id INT,
    year_col INT
)
PARTITION BY RANGE (year_col) (
    PARTITION p0 VALUES LESS THAN (1991),
    PARTITION p1 VALUES LESS THAN (1995),
    PARTITION p2 VALUES LESS THAN (1999)
);
            次のように、2002
            未満の値を格納するための新しいパーティション
            p3
            をこのテーブルに追加できます。
          
ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
            1 つ、または複数の
            RANGE や
            LIST
            分割をドロップするために
            DROP PARTITION
            を利用することができます。このステートメントは
            HASH や
            KEY
            パーティションと一緒に利用することはできません。代わりに
            COALESCE PARTITION
            を利用してください
            (下記参照)。partition_names
            リストの中で名前が付けられた、ドロップされたパーティションに格納されたデータはすべて廃棄されます。たとえば、あらかじめ定義されたテーブル
            t1
            を利用し、ここに表されているように
            p0 と
            p1
            という名前が付いたパーティションをドロップすることができます。
          
ALTER TABLE t1 DROP PARTITION p0, p1;
              DROP PARTITION
              は、NDBCLUSTER
              ストレージエンジンを使用するテーブルでは機能しません。Management of RANGE and LIST  Partitions、Known Limitations of MySQL Cluster
              を参照してください。
            
            ADD PARTITION と
            DROP PARTITION は現在
            IF [NOT] EXISTS
            をサポートしていません。パーティションやパーティション化されたテーブルをリネームすることも不可能です。代わりに、パーティションの名前を変更する場合は、パーティションを削除および再作成する必要があります。パーティション化されたテーブルの名前を変更する場合は、すべてのパーティションを削除し、テーブルの名前を変更してから、削除されたパーティションを戻します。
          
            数字
            でパーティション数を減らすために
            HASH か
            KEY
            で分割されたテーブルと一緒に
            COALESCE PARTITION
            を利用することができます。次の定義を利用して
            t2
            テーブルを作成したと仮定してください。
          
CREATE TABLE t2 (
    name VARCHAR (30),
    started DATE
)
PARTITION BY HASH( YEAR(started) )
PARTITIONS 6;
            次のステートメントを利用して
            t2
            で利用されたパーティション数を 6 から 4
            に減らすことができます。
          
ALTER TABLE t2 COALESCE PARTITION 2;
            最後の number
            パーティションに含まれているデータは、残りのパーティションにマージすることができます。この場合は、パーティション
            4 および 5 が最初の 4
            つのパーティションにマージされます
            (パーティション番号は 0、1、2、3)。
          
            パーティション化されたテーブルで利用されたパーティションのいくつかを変更するには、REORGANIZE
            PARTITION
            を利用することができます。このステートメントの利用方法はいくつかあります:
          
                いくつかのセットになったパーティションを単一パーティションにマージする。この方法は、いくつかのパーティションに
                partition_names
                リストの中で名前をつけ、partition_definition
                に 1
                つの定義を付けることで行うことができます。
              
                1
                つの既存パーティションをいくつかのパーティションに分割する。これは、単一パーティションに
                partition_names
                で名前をつけ、いくつかの
                partition_definitions
                を与えることで実行できます。
              
                VALUES LESS THAN
                を利用して定義されたパーティションのサブセットの範囲、または
                VALUES IN
                を利用して定義されたパーティションのサブセットの値リストを変更する。
              
                また、データを強制的に再配布するために、HASH
                分割を使用して自動的にパーティション化されたテーブルに対して、このステートメントを
                partition_names
                INTO
                (partition_definitions)NDBCLUSTER
                テーブルだけです。) これは、既存の MySQL
                Cluster に新しい MySQL Cluster
                データノードをオンラインで追加したあと、既存の
                MySQL Cluster
                テーブルデータを新しいデータノードに再配布できる
                MySQL Cluster NDB 6.4.0
                以降で有効です。その場合は、次に示すとおりに
                ONLINE
                オプションを指定してステートメントを呼び出すようにしてください。
              
ALTER ONLINE TABLE table REORGANIZE PARTITION;
                ほかの DDL
                をオンラインのテーブル再編成と同時に実行することはできません。つまり、ALTER
                ONLINE TABLE ... REORGANIZE PARTITION
                ステートメントが実行されている間は、ほかの
                DDL
                ステートメントを発行できません。オンラインでの
                MySQL Cluster
                データノードの追加の詳細については、Adding MySQL Cluster Data Nodes Online
                を参照してください。
              
                明示的にパーティション化されたテーブルに対して、REORGANIZE
                PARTITION を
                partition_names
                INTO
                (partition_definitions)
              明示的に名前が付けられていないパーティションに対して、MySQL
              は自動的に
              p0、p1、p2
              などのデフォルト名を付けます。 MySQL 5.1.7
              では、サブパーティションに関しても同じことが言えます。
            
            ALTER TABLE ... REORGANIZE
            PARTITION
            ステートメントに関する詳細情報と例に関しては、Partition Management
            を参照してください。
          
              特定の ALTER
              TABLE
              ステートメントで使用できるのは、1 つの
              PARTITION
              BY、ADD
              PARTITION、DROP
              PARTITION、REORGANIZE
              PARTITION、または
              COALESCE PARTITION
              節だけです。
            
            MySQL 5.1.5
            では、CHECK
            TABLE や
            REPAIR TABLE
            などのステートメントによる、パーティション化されていないテーブルのために実装されている機能に似たパーティションの保守および修復機能を提供するためのいくつかの追加オプションが導入されました
            (MySQL 5.1.27
            からは、これらの機能はパーティション化されたテーブルに対してもサポートされています。この項目の最後にある注記を参照)。これらには、ANALYZE
            PARTITION、CHECK
            PARTITION、OPTIMIZE
            PARTITION、REBUILD
            PARTITION、そして
            REPAIR PARTITION
            が含まれます。これらのオプションのそれぞれは、カンマで区切られた
            1 つか複数のパーティション名で構成される
            partition_names
            節を利用します。パーティションは変更されるテーブルの中にすでに存在していなければいけません。詳細および例については、Maintenance of Partitions
            を参照してください。
          
            ANALYZE
            PARTITION、CHECK
            PARTITION、OPTIMIZE
            PARTITION、および
            REPAIR PARTITION
            オプションは MySQL 5.1.24 で無効になり、MySQL
            5.1.27 でふたたび有効になりました。(Bug#20129)
            これらのオプションは、パーティション化されていないテーブルに対してはサポートされておらず、MySQL
            5.1.31
            からはこのようなテーブルに対して禁止されています。
          
              MySQL 5.1.27
              からは、パーティション化されたテーブルに対してステートメント
              ANALYZE
              TABLE、CHECK
              TABLE、OPTIMIZE
              TABLE、および
              REPAIR
              TABLE
              を使用できます。詳細については、項8.5.2. 「テーブル保守ステートメント」
              を参照してください。
            
            テーブルや、そのデータに影響を与える事無くテーブルの分割を除去できるようにするため、MySQL
            5.1.8 で REMOVE
            PARTITIONING
            が導入されました。(以前は、これは
            ENGINE
            オプションを使用して実行されました。)
            このオプションは、追加、ドロップ、ドロップカラムやインデックスをリネームするために利用されるような、ALTER
            TABLE
            オプションと組み合わせることができます。
          
            MySQL 5.1.7
            以前のバージョンでは、ENGINE
            オプションを
            ALTER TABLE
            と一緒に利用すると、テーブルが削除されてしまう可能性がある分割の原因になりました。MySQL5.1.8
            からは、このオプションによる、テーブルに利用されるストレージエンジンの変更はほとんど無く、分割にもまったく影響を与えません。
          
        mysql_info() C
        API
        機能を利用すると、いくつの行がコピーされ、(IGNORE
        が利用されたとき)
        いくつの行がユニークキー値の複製のために削除されたのかを確認することができます。mysql_info()
        を参照してください。
      
        ALTER TABLE
        の利用方法を表すいくつかの例があります。ここに表されているように作成された、テーブル
        t1
        から始めましょう。
      
CREATE TABLE t1 (a INTEGER,b CHAR(10));
        t1 から
        t2
        のテーブルの名前を付けるには
      
ALTER TABLE t1 RENAME t2;
        カラム a を
        INTEGER から
        TINYINT NOT NULL
        (同じ名前のまま)
        に変更するために、そしてカラム
        b
        を、b から
        c
        に変更するのと同じように、CHAR(10)
        から CHAR(20)
        に変更するためには:
      
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c 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't 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=
        テーブルオプションを使用することによって、最初のシーケンス番号を設定できます。Session System Variables
        を参照してください。
      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;
          マスターとスレーブの両方で同じ順序になることを保証するには、t1
          のすべてのカラムが
          ORDER BY
          節で参照されている必要があります。
        
        AUTO_INCREMENT
        属性をカラムに持つコピーを作成し、投入することに使用した方法に関係なく、このファイナルステップは、オリジナルのテーブルをドロップしてから、そのコピーの名前を変更します。
      
DROP t1; ALTER TABLE t2 RENAME t1;

