MySQLでカラム追加する方法

データベース・SQL

この記事では、MySQLで既存テーブルに新しいカラム(列)を追加する方法を詳しく解説します。

基本的な構文から応用的な使い方まで、実際のサンプルテーブルを使って分かりやすく説明していきます。

スポンサーリンク
  1. ALTER TABLE ADD COLUMNとは
    1. カラム追加が必要な場面
  2. 基本的な構文
    1. 標準的なカラム追加構文
    2. COLUMN キーワードの省略
  3. 実践的な使用例
    1. サンプルテーブルの準備
    2. 例1:基本的なカラム追加
    3. 例2:制約付きカラムの追加
    4. 例3:位置を指定したカラム追加
    5. 例4:複数カラムの同時追加
  4. データ型別の追加例
    1. 文字列型カラムの追加
    2. 数値型カラムの追加
    3. 日付・時刻型カラムの追加
    4. その他のデータ型
  5. 制約の詳細説明
    1. NOT NULL制約
    2. UNIQUE制約
    3. PRIMARY KEY制約
    4. CHECK制約(MySQL 8.0.16以降)
  6. カラム追加の高度なテクニック
    1. 既存データに基づいた初期値の設定
    2. 計算カラムの追加(Generated Column)
    3. 外部キー制約付きカラムの追加
  7. パフォーマンスとベストプラクティス
    1. 大きなテーブルでのカラム追加
    2. インデックス付きカラムの追加
  8. トラブルシューティング
    1. よくあるエラーと対処法
    2. カラム追加の取り消し
  9. セキュリティ考慮事項
    1. 権限の確認
    2. 本番環境での注意点
  10. バージョン別の対応
    1. MySQL 5.7での制限事項
    2. MySQL 8.0の新機能
  11. 実用的なSQL作成パターン
    1. パターン1:段階的なカラム追加
    2. パターン2:包括的なテーブル拡張
    3. パターン3:監査ログ機能の追加
  12. よくある質問
    1. カラム追加時にテーブルはロックされますか?
    2. 既存データがあるテーブルにNOT NULL制約付きカラムを追加できますか?
    3. カラム追加後に既存データに値を設定する方法は?
    4. 本番環境で安全にカラム追加を行う方法は?
  13. まとめ

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();

本番環境での注意点

事前準備

  1. バックアップの作成
-- テーブルのバックアップ
CREATE TABLE employees_backup AS SELECT * FROM employees;
  1. テスト環境での事前確認
  2. ダウンタイムの事前告知
  3. ロールバック手順の準備

バージョン別の対応

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;

本番環境で安全にカラム追加を行う方法は?

推奨手順

  1. バックアップの作成
  2. テスト環境での事前確認
  3. メンテナンス時間での実行
  4. 段階的な実行(複雑な変更の場合)
  5. 実行後の検証

まとめ

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 valueDEFAULT値の指定が重要
位置指定ADD COLUMN name type AFTER existing_columnテーブル構造の整理
大量データ段階的実行とメンテナンス時間パフォーマンス考慮

コメント

タイトルとURLをコピーしました