Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

ALTER TABLE

既存テーブルの定義を変更する命令です。列の追加・削除・変更、テーブル名の変更などを行えます。

構文
-- 列を追加します。
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 新名 も使えます。
サンプルコード
-- 会員テーブルに電話番号列を追加します。
ALTER TABLE members ADD COLUMN phone VARCHAR(20) AFTER email;

-- 名前列の最大文字数を100から200に拡張します(MySQL)。
ALTER TABLE members MODIFY COLUMN name VARCHAR(200) NOT NULL;

-- 列名を旧名から新名に変更します(MySQL)。
ALTER TABLE members CHANGE COLUMN registed_at registered_at DATETIME NOT NULL;

-- 不要になった列を削除します。
ALTER TABLE members DROP COLUMN old_column;

-- テーブル名を変更します。
ALTER TABLE users RENAME TO members;

-- 複数の変更を一度に実行します(MySQL)。
ALTER TABLE products
    ADD COLUMN description TEXT AFTER product_name,
    MODIFY COLUMN price DECIMAL(12, 2) NOT NULL;
実行結果
-- ALTER TABLE members ADD COLUMN phone VARCHAR(20) AFTER email; 実行後の SHOW COLUMNS 結果例
-- +---------------+--------------+------+-----+-------------------+
-- | 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 |
-- +---------------+--------------+------+-----+-------------------+
データベース別の書き方

列の追加と削除の基本構文は主要なデータベースで共通して使用できます。

-- 列の追加(共通)
ALTER TABLE members ADD COLUMN phone VARCHAR(20);

-- 列の削除(共通)
ALTER TABLE members DROP COLUMN old_column;

列の定義変更はデータベースによって構文が異なります。MySQL は『MODIFY COLUMN』、PostgreSQL は『ALTER COLUMN ... TYPE』、SQL Server は『ALTER COLUMN』を使用します。

-- MySQL
ALTER TABLE members MODIFY COLUMN name VARCHAR(200) NOT NULL;

-- PostgreSQL
ALTER TABLE members ALTER COLUMN name TYPE VARCHAR(200);

-- SQL Server
ALTER TABLE members ALTER COLUMN name NVARCHAR(200) NOT NULL;

列名の変更も構文が異なります。MySQL は『CHANGE COLUMN』、PostgreSQL は『RENAME COLUMN』、SQL Server は『sp_rename』プロシージャを使用します。

-- MySQL
ALTER TABLE members CHANGE COLUMN registed_at registered_at DATETIME NOT NULL;

-- PostgreSQL
ALTER TABLE members RENAME COLUMN registed_at TO registered_at;

-- SQL Server
EXEC sp_rename 'members.registed_at', 'registered_at', 'COLUMN';

『ADD COLUMN ... AFTER 既存列名』で挿入位置を指定できるのは MySQL のみです。PostgreSQL・Oracle・SQL Server では列は常に末尾に追加されます。SQLite は列の削除(『DROP COLUMN』)がバージョン 3.35.0 以降でのみサポートされています。

概要

『ALTER TABLE』は稼働中のデータベースで頻繁に使用します。大規模なテーブルで列を追加・変更するとテーブルロックが発生してアクセスが停止することがあるため、本番環境では事前にメンテナンス時間を確保するか、Online DDLをサポートするストレージエンジン(InnoDBなど)の機能を活用することを検討してください。

『DROP COLUMN』はデータごと削除されます。誤操作のリスクが高いため、実行前にバックアップを取ることを強く推奨します。

テーブルを新規に作成する手順は『CREATE TABLE』を参照してください。インデックスの追加・削除は『CREATE INDEX』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。