ALTER TABLE
| 対応: | SQL-92(1992) |
|---|
既存テーブルの定義を変更する命令です。列の追加・削除・変更、テーブル名の変更などを行えます。
構文
列を追加します。
ALTER TABLE テーブル名 ADD COLUMN 列名 データ型 [制約];
列を削除します。
ALTER TABLE テーブル名 DROP COLUMN 列名;
列の定義を変更します(MySQL)。
ALTER TABLE テーブル名 MODIFY COLUMN 列名 新しいデータ型 [制約];
列名と定義を同時に変更します(MySQL)。
ALTER TABLE テーブル名 CHANGE COLUMN 旧列名 新列名 データ型 [制約];
テーブル名を変更します。
ALTER TABLE テーブル名 RENAME TO 新しいテーブル名;
構文一覧
| 構文 | 概要 |
|---|---|
| ADD COLUMN 列名 型 | テーブルに新しい列を追加します。デフォルトで末尾に追加されます。 |
| ADD COLUMN 列名 型 AFTER 既存列名 | 指定した列の直後に新しい列を追加します(MySQL)。 |
| DROP COLUMN 列名 | 指定した列とそのデータを削除します。元に戻せないため注意が必要です。 |
| MODIFY COLUMN 列名 型 | 列のデータ型や制約を変更します(MySQL)。列名は変わりません。 |
| CHANGE COLUMN 旧名 新名 型 | 列名と定義をまとめて変更します(MySQL)。 |
| ALTER COLUMN 列名 TYPE 型 | 列の型を変更します(PostgreSQL)。 |
| RENAME TO 新テーブル名 | テーブル名を変更します(標準SQL・PostgreSQL)。MySQLでは RENAME TABLE 旧名 TO 新名 も使えます。 |
サンプルコード
以下の『members』テーブルを例に説明します。
会員テーブルに電話番号列を追加します。
sample_alter_table.sql
ALTER TABLE members ADD COLUMN phone VARCHAR(20) AFTER email;
Query OK, 0 rows affected
テーブル構造を確認します。『DESCRIBE』はテーブルの列名・型・制約などの定義を一覧表示するコマンドです(MySQL)。PostgreSQLでは『\d テーブル名』、SQLiteでは『.schema テーブル名』で同様の確認ができます。email の直後に phone 列が追加されています。
sample_alter_table.sql
DESCRIBE members;
+---------------+--------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +---------------+--------------+------+-----+-------------------+ | member_id | int | NO | PRI | NULL | | name | varchar(100) | NO | | NULL | | email | varchar(255) | NO | UNI | NULL | | phone | varchar(20) | YES | | NULL | | registered_at | datetime | NO | | CURRENT_TIMESTAMP | +---------------+--------------+------+-----+-------------------+ 5 rows in set
名前列の最大文字数を100から200に拡張します(MySQL)。
sample_alter_table.sql
ALTER TABLE members MODIFY COLUMN name VARCHAR(200) NOT NULL;
Query OK, 0 rows affected
テーブル構造を確認します。name 列の型が varchar(200) に変更されています。
sample_alter_table.sql
DESCRIBE members;
+---------------+--------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +---------------+--------------+------+-----+-------------------+ | member_id | int | NO | PRI | NULL | | name | varchar(200) | NO | | NULL | | email | varchar(255) | NO | UNI | NULL | | phone | varchar(20) | YES | | NULL | | registered_at | datetime | NO | | CURRENT_TIMESTAMP | +---------------+--------------+------+-----+-------------------+ 5 rows in set
列名を旧名から新名に変更します(MySQL)。
sample_alter_table.sql
ALTER TABLE members CHANGE COLUMN registed_at registered_at DATETIME NOT NULL;
Query OK, 0 rows affected
変更結果を確認します。列名が『registered_at』に修正されています。
sample_alter_table.sql
DESCRIBE members;
+---------------+--------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +---------------+--------------+------+-----+-------------------+ | member_id | int | NO | PRI | NULL | | name | varchar(200) | NO | | NULL | | email | varchar(255) | NO | UNI | NULL | | phone | varchar(20) | YES | | NULL | | registered_at | datetime | NO | | CURRENT_TIMESTAMP | +---------------+--------------+------+-----+-------------------+ 5 rows in set
不要になった列を削除します。
sample_alter_table.sql
ALTER TABLE members DROP COLUMN phone;
Query OK, 0 rows affected
変更結果を確認します。phone 列が削除されています。
sample_alter_table.sql
DESCRIBE members;
+---------------+--------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +---------------+--------------+------+-----+-------------------+ | member_id | int | NO | PRI | NULL | | name | varchar(200) | NO | | NULL | | email | varchar(255) | NO | UNI | NULL | | registered_at | datetime | NO | | CURRENT_TIMESTAMP | +---------------+--------------+------+-----+-------------------+ 4 rows in set
テーブル名を変更します。
sample_alter_table.sql
ALTER TABLE users RENAME TO members;
Query OK, 0 rows affected
複数の変更を一度に実行します(MySQL)。
sample_alter_table.sql
ALTER TABLE products
ADD COLUMN description TEXT AFTER product_name,
MODIFY COLUMN price DECIMAL(12, 2) NOT NULL;
Query OK, 0 rows affected
データベース別の書き方
列の追加と削除の基本構文は主要なデータベースで共通して使用できます。
-- 列の追加(共通) ALTER TABLE members ADD COLUMN phone VARCHAR(20); -- 列の削除(共通) ALTER TABLE members DROP COLUMN old_column;
列の定義変更はデータベースによって構文が異なります。MySQL は『MODIFY COLUMN』、PostgreSQL は『ALTER COLUMN ... TYPE』を使用します。
-- MySQL ALTER TABLE members MODIFY COLUMN name VARCHAR(200) NOT NULL; -- PostgreSQL ALTER TABLE members ALTER COLUMN name TYPE VARCHAR(200);
列名の変更も構文が異なります。MySQL は『CHANGE COLUMN』、PostgreSQL は『RENAME COLUMN』を使用します。
-- MySQL ALTER TABLE members CHANGE COLUMN registed_at registered_at DATETIME NOT NULL; -- PostgreSQL ALTER TABLE members RENAME COLUMN registed_at TO registered_at;
『ADD COLUMN ... AFTER 既存列名』で挿入位置を指定できるのは MySQL のみです。PostgreSQL では列は常に末尾に追加されます。SQLite は列の削除(『DROP COLUMN』)がバージョン 3.35.0 以降でのみサポートされています。
概要
『ALTER TABLE』は稼働中のデータベースで頻繁に使用します。大規模なテーブルで列を追加・変更するとテーブルロックが発生してアクセスが停止することがあるため、本番環境では事前にメンテナンス時間を確保するか、Online DDLをサポートするストレージエンジン(InnoDBなど)の機能を活用することを検討してください。
『DROP COLUMN』はデータごと削除されます。誤操作のリスクが高いため、実行前にバックアップを取ることを強く推奨します。
テーブルを新規に作成する手順は『CREATE TABLE』を参照してください。インデックスの追加・削除は『CREATE INDEX』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。