MySQLの1つのALTER文でカラムとインデックスを同時に追加する方法
はじめに
MySQLでは、既存のテーブルに新しいカラムを追加すると同時に、そのカラムにインデックスを設定したいケースはよくあります。通常、これらは2つの別々のクエリで実行するイメージがありますが、実はALTER TABLE文を使えば、たった1つのクエリでカラムの追加とインデックスの作成を同時に行うことができます。
この記事では、具体的な手順を実行例とともにわかりやすく解説します。
基本構文
ALTER文にADD句を組み合わせて使用します。構文は以下の通りです。
ALTER TABLE テーブル名
ADD カラム名 DATETIME DEFAULT NOW(),
ADD INDEX(カラム名);
ポイントは、複数のADD句を「,(カンマ)」で区切って並べることです。これにより、1回の実行で複数の変更操作をまとめて処理できます。
検証用テーブルの作成
まず、動作確認のためのサンプルテーブルを作成しましょう。
mysql> CREATE TABLE DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(100),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.69 sec)
続いて、DESCコマンドでテーブル構造を確認します。
mysql> DESC DemoTable;
出力結果
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
現時点では「Id」と「Name」の2つのカラムだけが存在していることがわかります。
1つのクエリでカラムとインデックスを追加する
それでは本題です。以下のように、カラム追加(ADD COLUMN相当)とインデックス作成(ADD INDEX)を1つのALTER文に記述します。
mysql> ALTER TABLE DemoTable
-> ADD ArrivalDate DATETIME DEFAULT NOW(),
-> ADD INDEX(ArrivalDate);
Query OK, 0 rows affected (2.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
このクエリでは次の2つの処理が同時に実行されています。
- ArrivalDateカラムの追加: データ型はDATETIMEで、デフォルト値としてNOW()(現在日時)が自動的に設定されます。
- インデックスの作成: ArrivalDateカラムに対するインデックスが作成され、日付による検索やソートが高速化されます。
追加後のテーブル構造の確認
もう一度DESCコマンドでテーブル構造を見てみましょう。
mysql> DESC DemoTable;
出力結果
+-------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(100) | YES | | NULL | |
| ArrivalDate | datetime | YES | MUL | CURRENT_TIMESTAMP | |
+-------------+--------------+------+-----+-------------------+----------------+
3 rows in set (0.01 sec)
出力結果の見方
- Key列がMULになっている: これはインデックスが正しく作成されたことを示しています。MULは、そのカラムがインデックスの先頭カラムである(または単一カラムインデックスを持つ)場合に表示されます。
- Default列がCURRENT_TIMESTAMPになっている: DEFAULT NOW()を指定したことで、新規レコード挿入時に現在の日時が自動的に登録されます。
まとめ
ALTER TABLE文では、ADD句をカンマで連結することにより、カラム追加とインデックス作成を1つのクエリで同時に実行できます。テーブルへの変更操作をまとめて行うことで、クエリの実行回数を減らせるとともに、コードもすっきりします。特に大きなテーブルを扱う場合、変更操作を1回にまとめられるのはパフォーマンス面でもメリットがあるので、ぜひ活用してみてください。
-
MySQLの1つのクエリで日付に1年と2日を追加する方法
MySQLで日付に1年と2日を同時に加算したい場合は、DATE_ADD関数とINTERVALを組み合わせます。DATE_ADD関数を入れ子(ネスト)にするのがポイントです。ここでは、実際にテーブルを作成してサンプルデータを操作しながら、手順を詳しく解説します。 1. サンプルテーブルを作成する まず、日付(DATE型)を格納するカラムを持つテーブルを作成します。 mysql> create table DemoTable1376 -> ( -> AdmissionDate date -> ); Query OK, 0 rows affected
-
MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法
はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実