Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


13.1.7.3 ALTER TABLE の例

次に示すように作成されているテーブル t1 から始めます。

CREATE TABLE t1 (a INTEGER,b CHAR(10));

テーブルの名前を t1 から t2 に変更するには、次のようにします。

ALTER TABLE t1 RENAME t2;

カラム aINTEGER から TINYINT NOT NULL に変更し (名前は同じままにします)、またカラム bCHAR(10) から CHAR(20) に変更し、さらにその名前を b から c に変更するには、次のようにします。

ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

d という名前の新しい TIMESTAMP カラムを追加するには、次のようにします。

ALTER TABLE t2 ADD d TIMESTAMP;

カラム d にインデックスを、またカラム aUNIQUE インデックスを追加するには、次のようにします。

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 にできないため cNOT 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=value を実行するか、または AUTO_INCREMENT=value テーブルオプションを使用することによって、最初のシーケンス番号を設定できます。セクション5.1.4「サーバーシステム変数」を参照してください。

MyISAM テーブルでは、AUTO_INCREMENT カラムを変更しない場合、シーケンス番号は影響を受けません。AUTO_INCREMENT カラムを削除してから、別の AUTO_INCREMENT カラムを追加した場合、シーケンス番号は 1 から付け直されます。

レプリケーションが使用されている場合は、テーブルに AUTO_INCREMENT カラムを追加しても、スレーブとマスターで行の順序が同じにならない可能性があります。これが発生するのは、行が番号付けされる順序が、テーブルに使用される固有のストレージエンジンおよび行が挿入された順序に依存するためです。マスターとスレーブで同じ順序を持つことが重要である場合は、行を並べ替えてから AUTO_INCREMENT 番号を割り当てる必要があります。テーブル t1AUTO_INCREMENT カラムを追加すると仮定した場合、次のステートメントは、t1 と同一であるが、AUTO_INCREMENT カラムを含む新しいテーブル t2 を生成します。

CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;

ここでは、テーブル t1 にカラム col1col2 が存在することを前提にしています。

この一連のステートメントではまた、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;

User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Ferdous Khan on January 12, 2012
ALTER TABLE sales.order ADD UNIQUE(order_ref);

This command will update 'sales' databases 'order' tables 'order_ref' column to become uniquely indexed. If the column already have some duplicate data, an error message will be prompted.
Sign Up Login You must be logged in to post a comment.