SQL で既存のテーブルに列を追加することは、データベーススキーマの変化に合わせて頻繁に必要になる作業です。ALTER TABLE ステートメントを使うと、データを失うことなく既存テーブルの構造を変更できます。このガイドでは、ALTER TABLE を使って列を追加する方法を実践的な例とともに解説します。
ALTER TABLE を理解する
ALTER TABLE コマンドは、既存のテーブルの列を追加、削除、変更するために使用します。テーブルの制約を変更することもできます。このチュートリアルでは、新しい列の追加に絞って説明します。
新しい列を追加する際は、列名、データ型、および必要な制約やデフォルト値を指定する必要があります。この操作はアトミックで、既存のデータには影響しません。
列を追加する基本構文
テーブルに新しい列を追加する基本構文は次のとおりです:
ALTER TABLE table_name
ADD column_name column_type [constraint];
- table_name:列を追加するテーブルの名前。
- column_name:新しい列の名前。
-
column_type:新しい列のデータ型(例:
VARCHAR、INT、DATEなど)。 -
constraint:任意。
NOT NULL、UNIQUE、DEFAULT値などの追加制約。
例:列を追加する
まずはシンプルな employees テーブルから始めましょう:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50)
);
-- Current data in employees table:
INSERT INTO employees (id, name, position) VALUES (1, 'Alice', 'Engineer');
INSERT INTO employees (id, name, position) VALUES (2, 'Bob', 'Manager');
SELECT * FROM employees;
出力:
+----+-------+----------+
| id | name | position |
+----+-------+----------+
| 1 | Alice | Engineer |
| 2 | Bob | Manager |
+----+-------+----------+
給与用の新しい列を追加する
salary という名前の新しい列を、データ型 DECIMAL(10, 2) で追加してみましょう。この型は小数点以下2桁を含む最大10桁の数値を格納できます:
ALTER TABLE employees
ADD salary DECIMAL(10, 2);
このコマンドにより、employees テーブルに新しい salary 列が追加されます。既存の行のこの列は、更新するまで NULL 値になります。
テーブル構造を確認する
DESCRIBE または SHOW COLUMNS(データベースシステムによって異なります)を使って、列が追加されたことを確認します:
DESCRIBE employees;
出力:
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(100)| YES | | NULL | |
| position | varchar(50) | YES | | NULL | |
| salary | decimal(10,2)| YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
デフォルト値付きで列を追加する
デフォルト値を指定して列を追加することもできます。現在の日付をデフォルトとする hire_date 列を追加する方法は次のとおりです:
ALTER TABLE employees
ADD hire_date DATE DEFAULT CURRENT_DATE;
employees テーブルに新しく挿入される行では、値が指定されない場合、hire_date に自動的に現在の日付が設定されます。
NOT NULL 制約付きで列を追加する
既存のテーブルに NOT NULL 制約付きの列を追加するには、特別な配慮が必要です。データが既に入っているテーブルに、デフォルト値を指定せずに NOT NULL 列を追加することはできません。既存の行が制約に違反してしまうためです。
既存データに対する NOT NULL の問題
テーブルに既存の行がある場合、このコマンドは失敗します:
-- This will fail on tables with existing data
ALTER TABLE employees
ADD phone_number VARCHAR(20) NOT NULL;
このエラーは、既存の行の新しい列が NULL 値となり、NOT NULL 制約に違反するために発生します。
解決策1:デフォルト値付きで列を追加する
最もシンプルな解決策は、デフォルト値を指定することです:
ALTER TABLE employees
ADD phone_number VARCHAR(20) NOT NULL DEFAULT 'Unknown';
これがうまくいく理由:
- 既存のすべての行にデフォルト値が設定された状態で列が追加される
NOT NULL制約がただちに満たされる- 今後の挿入では値を指定するか、デフォルト値が使われる
解決策2:複数ステップで行う
値をより細かく制御したい場合は、複数ステップのアプローチを使います:
-- Step 1: Add the column as nullable
ALTER TABLE employees
ADD phone_number VARCHAR(20);
-- Step 2: Update existing rows with appropriate values
UPDATE employees
SET phone_number = 'Unknown'
WHERE phone_number IS NULL;
-- Step 3: Add the NOT NULL constraint
ALTER TABLE employees
ALTER COLUMN phone_number SET NOT NULL;
注:ステップ3の構文はデータベースシステムによって異なります:
-
PostgreSQL:
ALTER COLUMN phone_number SET NOT NULL -
MySQL:
MODIFY COLUMN phone_number VARCHAR(20) NOT NULL -
SQL Server:
ALTER COLUMN phone_number VARCHAR(20) NOT NULL
解決策3:条件付きのデフォルト値
既存のデータに応じて異なるデフォルト値を設定できます:
-- Add column with temporary default
ALTER TABLE employees
ADD department VARCHAR(50) NOT NULL DEFAULT 'TBD';
-- Update with conditional logic based on position
UPDATE employees
SET department = CASE
WHEN position = 'Engineer' THEN 'Engineering'
WHEN position = 'Manager' THEN 'Management'
ELSE 'General'
END;
-- Optionally remove the default if you don't want it for future inserts
ALTER TABLE employees
ALTER COLUMN department DROP DEFAULT;
NOT NULL 列のベストプラクティス
-
事前に計画する:テーブルの初期設計時に
NOT NULL制約を検討する - 意味のあるデフォルト値を使う:ビジネスロジックに合ったデフォルト値を選ぶ
-
まずテストする:
ALTER TABLE操作は必ずデータのコピーでテストする - 変更を記録する:チームで共有できるようスキーマの変更履歴を残す
- データ移行を考慮する:新しい列に意味のあるデータを入れる方法を計画する
NOT NULL 制約を確認する
NOT NULL 列を追加したら、制約が設定されていることを確認します:
-- Check table structure
DESCRIBE employees;
-- Verify constraint by attempting to insert NULL (should fail)
INSERT INTO employees (id, name, position, phone_number)
VALUES (3, 'Carol', 'Analyst', NULL);
-- Error: Column 'phone_number' cannot be null
関連する操作
列の追加方法がわかったら、ほかの ALTER TABLE 操作も学んでみましょう:
これらの操作は、アプリケーションの要件の変化に合わせてデータベーススキーマを維持・発展させるうえで欠かせません。
まとめ
ALTER TABLE で列を追加すれば、データを失うことなくスキーマを変更できます。この柔軟性により、変化するアプリケーションの要件にデータベースを適応させられます。スキーマを変更する前には必ずデータをバックアップし、既存のアプリケーションロジックとの互換性を確認してください。
より高度なデータベース操作や SQL データベースの効率的な管理には、Beekeeper Studio をぜひお試しください。データベーススキーマの管理や SQL 操作を直感的に行えるインターフェースを備えています。
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studio は以前の SQL ワークフローを完全に置き換えました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベース GUI を試してきましたが、Beekeeper は機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」