Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
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
  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.