次に示すように作成されたテーブル t1
から開始します:
CREATE TABLE t1 (a INTEGER, b CHAR(10));
テーブルの名前を t1
から t2
に変更するには、次のようにします。
ALTER TABLE t1 RENAME t2;
カラム a
を INTEGER
から TINYINT NOT NULL
に変更し (名前は同じままにします)、またカラム b
を CHAR(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
にインデックスを、またカラム 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 つのカラムを含む「NDB 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
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
が存在することを前提にしています。
この一連のステートメントでは、AUTO_INCREMENT
カラムが追加された、t1
と同一の新しいテーブル 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
の all カラムを参照する必要があります。
AUTO_INCREMENT
カラムを持つコピーを作成および移入するために使用する方法にかかわらず、最終手順は元のテーブルを削除してコピーの名前を変更することです。
DROP TABLE t1;
ALTER TABLE t2 RENAME t1;