この記事では、MySQLで既存テーブルに新しいカラム(列)を追加する方法を詳しく解説します。
基本的な構文から応用的な使い方まで、実際のサンプルテーブルを使って分かりやすく説明していきます。
ALTER TABLE ADD COLUMNとは

ALTER TABLE ADD COLUMNは、既存のテーブル構造を変更して新しいカラムを追加するSQL文です。
データベースの運用中にテーブル設計を変更する際に頻繁に使用される重要な機能です。
カラム追加が必要な場面
システム拡張時
- 新機能追加に伴う項目の追加
- ユーザー要求による項目の拡張
- 法令変更による必須項目の追加
データ分析の強化
- ログ情報の記録項目追加
- 分析用の計算項目追加
- パフォーマンス測定項目の追加
セキュリティ強化
- 監査ログ項目の追加
- アクセス制御項目の追加
- 暗号化関連項目の追加
基本的な構文
標準的なカラム追加構文
ALTER TABLE テーブル名
ADD COLUMN カラム名 データ型 [制約];
各要素の説明
- ALTER TABLE:テーブル変更コマンド
- テーブル名:変更対象のテーブル
- ADD COLUMN:カラム追加指示
- カラム名:新しく追加するカラムの名前
- データ型:カラムのデータ型(VARCHAR、INT、DATEなど)
- 制約:NOT NULL、DEFAULT、UNIQUEなどの制約(オプション)
COLUMN キーワードの省略
MySQLでは、COLUMNキーワードを省略できます:
ALTER TABLE テーブル名
ADD カラム名 データ型 [制約];
実践的な使用例

サンプルテーブルの準備
まず、実際に操作するためのサンプルテーブルを作成します:
-- サンプルテーブルの作成
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
salary DECIMAL(10,2)
);
-- サンプルデータの挿入
INSERT INTO employees (name, email, salary) VALUES
('田中太郎', 'tanaka@example.com', 350000.00),
('佐藤花子', 'sato@example.com', 420000.00),
('鈴木一郎', 'suzuki@example.com', 380000.00);
初期テーブル構造の確認
DESCRIBE employees;
結果
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
+--------+---------------+------+-----+---------+----------------+
例1:基本的なカラム追加
電話番号カラムの追加
ALTER TABLE employees
ADD COLUMN phone_number VARCHAR(15);
結果の確認
DESCRIBE employees;
追加後のテーブル構造
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| phone_number | varchar(15) | YES | | NULL | |
+--------------+---------------+------+-----+---------+----------------+
例2:制約付きカラムの追加
デフォルト値とNOT NULL制約付きの部署IDカラム
ALTER TABLE employees
ADD COLUMN department_id INT NOT NULL DEFAULT 1;
作成日時カラム(現在日時がデフォルト)
ALTER TABLE employees
ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
更新日時カラム(更新時に自動更新)
ALTER TABLE employees
ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
例3:位置を指定したカラム追加
テーブルの先頭にカラムを追加
ALTER TABLE employees
ADD COLUMN employee_code VARCHAR(10) FIRST;
特定のカラムの後ろに追加
ALTER TABLE employees
ADD COLUMN middle_name VARCHAR(30) AFTER name;
給与カラムの後に手当カラムを追加
ALTER TABLE employees
ADD COLUMN allowance DECIMAL(8,2) AFTER salary;
例4:複数カラムの同時追加
ALTER TABLE employees
ADD COLUMN address VARCHAR(200),
ADD COLUMN birth_date DATE,
ADD COLUMN hire_date DATE NOT NULL DEFAULT (CURRENT_DATE),
ADD COLUMN status ENUM('active', 'inactive', 'suspended') DEFAULT 'active';
データ型別の追加例

文字列型カラムの追加
固定長文字列
ALTER TABLE employees
ADD COLUMN gender CHAR(1);
可変長文字列
ALTER TABLE employees
ADD COLUMN notes VARCHAR(500);
長文テキスト
ALTER TABLE employees
ADD COLUMN description TEXT;
数値型カラムの追加
整数型
ALTER TABLE employees
ADD COLUMN age INT UNSIGNED;
小数型
ALTER TABLE employees
ADD COLUMN bonus_rate DECIMAL(5,2);
浮動小数点型
ALTER TABLE employees
ADD COLUMN performance_score FLOAT;
日付・時刻型カラムの追加
日付型
ALTER TABLE employees
ADD COLUMN retirement_date DATE;
日時型
ALTER TABLE employees
ADD COLUMN last_login DATETIME;
タイムスタンプ型
ALTER TABLE employees
ADD COLUMN last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
その他のデータ型
論理型(BOOLEAN)
ALTER TABLE employees
ADD COLUMN is_manager BOOLEAN DEFAULT FALSE;
列挙型(ENUM)
ALTER TABLE employees
ADD COLUMN employment_type ENUM('full-time', 'part-time', 'contract') DEFAULT 'full-time';
JSON型(MySQL 5.7以降)
ALTER TABLE employees
ADD COLUMN metadata JSON;
制約の詳細説明
NOT NULL制約
既存データがある場合のNOT NULL追加
-- デフォルト値を指定してNOT NULL制約を追加
ALTER TABLE employees
ADD COLUMN manager_id INT NOT NULL DEFAULT 0;
注意点
- 既存データがあるテーブルにNOT NULL制約付きカラムを追加する場合は、DEFAULT値が必要
- DEFAULT値を指定しないとエラーが発生する
UNIQUE制約
一意制約付きカラムの追加
ALTER TABLE employees
ADD COLUMN employee_number VARCHAR(20) UNIQUE;
PRIMARY KEY制約
注意:既存テーブルに主キーを追加する場合
-- 新しい主キーカラムを追加(既存の主キーがない場合のみ)
ALTER TABLE temp_table
ADD COLUMN new_id INT PRIMARY KEY AUTO_INCREMENT FIRST;
CHECK制約(MySQL 8.0.16以降)
ALTER TABLE employees
ADD COLUMN salary_level INT CHECK (salary_level BETWEEN 1 AND 10);
カラム追加の高度なテクニック

既存データに基づいた初期値の設定
カラム追加後に既存データに基づいて値を更新
-- まずカラムを追加
ALTER TABLE employees
ADD COLUMN name_length INT;
-- 既存データに基づいて値を更新
UPDATE employees
SET name_length = CHAR_LENGTH(name);
計算カラムの追加(Generated Column)
MySQL 5.7以降で使用可能
ALTER TABLE employees
ADD COLUMN full_name VARCHAR(100) GENERATED ALWAYS AS (CONCAT(name, ' (', employee_code, ')')) STORED;
仮想計算カラム
ALTER TABLE employees
ADD COLUMN annual_salary DECIMAL(12,2) GENERATED ALWAYS AS (salary * 12) VIRTUAL;
外部キー制約付きカラムの追加
-- 部署テーブルの存在を前提
ALTER TABLE employees
ADD COLUMN dept_id INT,
ADD CONSTRAINT fk_employee_department
FOREIGN KEY (dept_id) REFERENCES departments(id);
パフォーマンスとベストプラクティス
大きなテーブルでのカラム追加
パフォーマンス考慮事項
- 大量データがあるテーブルでの作業は時間がかかる
- 作業中はテーブルがロックされる可能性
- メンテナンス時間での実行を推奨
メンテナンス時間での実行例
-- 作業開始前のテーブルサイズ確認
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_database'
AND table_name = 'employees';
-- カラム追加の実行
ALTER TABLE employees
ADD COLUMN new_column VARCHAR(50);
インデックス付きカラムの追加
カラム追加と同時にインデックスを作成
ALTER TABLE employees
ADD COLUMN department_name VARCHAR(50),
ADD INDEX idx_department_name (department_name);
複合インデックスの作成
ALTER TABLE employees
ADD COLUMN team_id INT,
ADD INDEX idx_dept_team (department_id, team_id);
トラブルシューティング

よくあるエラーと対処法
エラー1:「Duplicate column name」
-- エラー例
ALTER TABLE employees
ADD COLUMN name VARCHAR(50); -- 'name'カラムは既に存在
-- 対処法:カラムの存在確認
SHOW COLUMNS FROM employees LIKE 'name';
エラー2:「Invalid default value」
-- エラー例
ALTER TABLE employees
ADD COLUMN hire_date DATE NOT NULL; -- DEFAULT値なしでNOT NULL
-- 対処法:DEFAULT値を指定
ALTER TABLE employees
ADD COLUMN hire_date DATE NOT NULL DEFAULT (CURRENT_DATE);
エラー3:「Data too long for column」
-- 対処法:適切なデータ型とサイズを指定
ALTER TABLE employees
ADD COLUMN long_description VARCHAR(1000); -- TEXT型を使用することも検討
カラム追加の取り消し
追加したカラムを削除する場合
ALTER TABLE employees
DROP COLUMN phone_number;
複数カラムの削除
ALTER TABLE employees
DROP COLUMN address,
DROP COLUMN birth_date;
セキュリティ考慮事項
権限の確認
必要な権限
- ALTER権限
- 対象テーブルへのアクセス権限
権限の確認方法
SHOW GRANTS FOR CURRENT_USER();
本番環境での注意点
事前準備
- バックアップの作成
-- テーブルのバックアップ
CREATE TABLE employees_backup AS SELECT * FROM employees;
- テスト環境での事前確認
- ダウンタイムの事前告知
- ロールバック手順の準備
バージョン別の対応

MySQL 5.7での制限事項
-- JSON型はMySQL 5.7以降
ALTER TABLE employees
ADD COLUMN preferences JSON; -- 5.7以降で使用可能
-- Generated Columnも5.7以降
ALTER TABLE employees
ADD COLUMN full_info VARCHAR(200) GENERATED ALWAYS AS (CONCAT(name, ' - ', email)) STORED;
MySQL 8.0の新機能
-- CHECK制約(8.0.16以降)
ALTER TABLE employees
ADD COLUMN age INT CHECK (age >= 18 AND age <= 65);
-- 関数インデックス(8.0以降)
ALTER TABLE employees
ADD COLUMN email_domain VARCHAR(100),
ADD INDEX idx_email_domain ((SUBSTRING_INDEX(email, '@', -1)));
実用的なSQL作成パターン
パターン1:段階的なカラム追加
-- ステップ1:基本カラムの追加
ALTER TABLE employees
ADD COLUMN department_id INT;
-- ステップ2:制約の追加
ALTER TABLE employees
MODIFY COLUMN department_id INT NOT NULL;
-- ステップ3:外部キー制約の追加
ALTER TABLE employees
ADD CONSTRAINT fk_emp_dept
FOREIGN KEY (department_id) REFERENCES departments(id);
パターン2:包括的なテーブル拡張
-- 従業員テーブルの機能拡張
ALTER TABLE employees
ADD COLUMN employee_code VARCHAR(10) UNIQUE FIRST,
ADD COLUMN department_id INT NOT NULL DEFAULT 1,
ADD COLUMN hire_date DATE NOT NULL DEFAULT (CURRENT_DATE),
ADD COLUMN status ENUM('active', 'inactive') DEFAULT 'active',
ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
ADD INDEX idx_department (department_id),
ADD INDEX idx_status (status),
ADD INDEX idx_hire_date (hire_date);
パターン3:監査ログ機能の追加
-- 監査ログ機能のためのカラム追加
ALTER TABLE employees
ADD COLUMN created_by VARCHAR(50) DEFAULT USER(),
ADD COLUMN updated_by VARCHAR(50) DEFAULT USER(),
ADD COLUMN version INT DEFAULT 1,
ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE,
ADD COLUMN deleted_at TIMESTAMP NULL;
よくある質問

カラム追加時にテーブルはロックされますか?
MySQL 5.6以降のオンラインDDLにより、多くの場合はロックを最小限に抑えてカラム追加が可能です。ただし、以下の場合はテーブルロックが発生する可能性があります:
- 大量のデータがあるテーブル
- 複雑な制約を持つカラムの追加
- 古いMySQLバージョン
既存データがあるテーブルにNOT NULL制約付きカラムを追加できますか?
はい、DEFAULT値を指定することで可能です:
ALTER TABLE employees
ADD COLUMN required_field VARCHAR(50) NOT NULL DEFAULT 'default_value';
カラム追加後に既存データに値を設定する方法は?
カラム追加後にUPDATE文で値を設定できます:
-- カラム追加
ALTER TABLE employees
ADD COLUMN department_name VARCHAR(50);
-- 既存データの更新
UPDATE employees
SET department_name = '営業部'
WHERE department_id = 1;
本番環境で安全にカラム追加を行う方法は?
推奨手順:
- バックアップの作成
- テスト環境での事前確認
- メンテナンス時間での実行
- 段階的な実行(複雑な変更の場合)
- 実行後の検証
まとめ
MySQLでのカラム追加は、ALTER TABLE ADD COLUMN文を使用した基本的だが重要な操作です。
重要なポイント
- 基本構文:
ALTER TABLE table_name ADD COLUMN column_name datatype
- 制約の指定:NOT NULL、DEFAULT、UNIQUEなどの制約が指定可能
- 位置指定:FIRST、AFTERで追加位置を制御
- 複数同時追加:カンマ区切りで複数カラムを一度に追加
用途別の推奨パターン
用途 | 推奨方法 | 注意点 |
---|---|---|
基本追加 | ADD COLUMN name type | シンプルで確実 |
制約付き | ADD COLUMN name type NOT NULL DEFAULT value | DEFAULT値の指定が重要 |
位置指定 | ADD COLUMN name type AFTER existing_column | テーブル構造の整理 |
大量データ | 段階的実行とメンテナンス時間 | パフォーマンス考慮 |
コメント