「SQLでテーブルのカラム名を変更したいけど、どうすればいいの?」
「データベースによって書き方が違うって本当?」
データベースを運用していると、カラム名の変更が必要になることってありますよね。設計の見直しや命名規則の統一など、理由は様々です。
この記事では、SQLでカラム名を変更する方法を、主要なデータベースごとに詳しく解説していきます。初心者の方でも安心して実行できるよう、具体的な例と注意点もしっかりお伝えしますよ。
カラム名変更の基本

まずは基本的な考え方から説明しますね。
ALTER TABLE文とは
カラム名を変更するには、ALTER TABLE文を使用します。
ALTER TABLEは、テーブルの構造を変更するためのSQL文です。カラム名の変更だけでなく、カラムの追加や削除、データ型の変更なども行えます。
基本的な構文のパターン
カラム名の変更方法は、データベース管理システム(DBMS)によって異なります。
主なパターン:
- RENAME COLUMN を使う方法(標準SQL)
- CHANGE を使う方法(MySQL独自)
- sp_rename を使う方法(SQL Server)
どのデータベースを使っているかによって、適切な構文を選ぶ必要があるんですね。
【MySQL / MariaDB】カラム名の変更方法
MySQLとMariaDBでのカラム名変更方法を見ていきましょう。
方法1:RENAME COLUMN(推奨・MySQL 8.0以降)
MySQL 8.0以降では、標準SQLに準拠した構文が使えます。
構文:
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名;
実例:
-- usersテーブルのnameカラムをfull_nameに変更
ALTER TABLE users
RENAME COLUMN name TO full_name;
-- productsテーブルのpriceカラムをunit_priceに変更
ALTER TABLE products
RENAME COLUMN price TO unit_price;
この方法が最もシンプルで分かりやすいです。
方法2:CHANGE(MySQL全バージョン対応)
古いMySQLバージョンでも使える方法です。
構文:
ALTER TABLE テーブル名
CHANGE 古いカラム名 新しいカラム名 データ型;
重要ポイント:
- データ型を再度指定する必要がある
- データ型を間違えると予期しない変更が起きる
実例:
-- nameカラム(VARCHAR(100))をfull_nameに変更
ALTER TABLE users
CHANGE name full_name VARCHAR(100);
-- ageカラム(INT)をuser_ageに変更
ALTER TABLE users
CHANGE age user_age INT;
-- 制約も含めて指定
ALTER TABLE users
CHANGE email new_email VARCHAR(255) NOT NULL UNIQUE;
データ型や制約を正確に指定することが大切です。
複数のカラムを同時に変更
複数のカラム名を一度に変更することもできます。
MySQL 8.0以降:
ALTER TABLE users
RENAME COLUMN first_name TO given_name,
RENAME COLUMN last_name TO family_name;
古いバージョン:
ALTER TABLE users
CHANGE first_name given_name VARCHAR(50),
CHANGE last_name family_name VARCHAR(50);
まとめて変更すると効率的ですね。
【PostgreSQL】カラム名の変更方法
PostgreSQLでの変更方法を見ていきましょう。
標準的な構文
PostgreSQLは標準SQLの構文に準拠しています。
構文:
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名;
実例:
-- カラム名を変更
ALTER TABLE employees
RENAME COLUMN emp_name TO employee_name;
-- 別の例
ALTER TABLE orders
RENAME COLUMN order_dt TO order_date;
PostgreSQLはシンプルで分かりやすい構文です。
スキーマを指定する場合
スキーマを明示的に指定することもできます。
構文:
ALTER TABLE スキーマ名.テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名;
実例:
-- publicスキーマのテーブル
ALTER TABLE public.customers
RENAME COLUMN cust_id TO customer_id;
-- 独自スキーマのテーブル
ALTER TABLE sales.transactions
RENAME COLUMN trans_id TO transaction_id;
複数のカラムを変更する場合
PostgreSQLでは、複数のカラムを同時に変更できません。
間違い:
-- これはエラーになる
ALTER TABLE users
RENAME COLUMN first_name TO given_name,
RENAME COLUMN last_name TO family_name;
正しい方法:
-- 別々に実行する
ALTER TABLE users
RENAME COLUMN first_name TO given_name;
ALTER TABLE users
RENAME COLUMN last_name TO family_name;
または、1つのトランザクション内で実行します。
トランザクション内で実行:
BEGIN;
ALTER TABLE users
RENAME COLUMN first_name TO given_name;
ALTER TABLE users
RENAME COLUMN last_name TO family_name;
COMMIT;
これなら、どちらか片方が失敗した場合に両方とも取り消されます。
【SQL Server】カラム名の変更方法

SQL Serverでは、専用のストアドプロシージャを使います。
sp_renameを使う方法
SQL Serverでは、sp_renameというシステムストアドプロシージャを使用します。
構文:
EXEC sp_rename 'テーブル名.古いカラム名', '新しいカラム名', 'COLUMN';
実例:
-- カラム名を変更
EXEC sp_rename 'users.name', 'full_name', 'COLUMN';
-- スキーマ付きで指定
EXEC sp_rename 'dbo.employees.emp_id', 'employee_id', 'COLUMN';
-- 別の例
EXEC sp_rename 'products.price', 'unit_price', 'COLUMN';
重要な注意:
- テーブル名とカラム名をドット(.)で繋ぐ
- 最後の引数に’COLUMN’を必ず指定
- シングルクォートで囲む
警告メッセージについて
sp_renameを実行すると、警告が表示されます。
警告メッセージ例:
Caution: Changing any part of an object name could break scripts and stored procedures.
これは、ビューやストアドプロシージャなどの依存オブジェクトに影響があるかもしれない、という警告です。問題なければ無視してOKですが、依存関係は事前に確認しましょう。
複数カラムの変更
SQL Serverでも、複数のカラムは個別に実行します。
実例:
-- 1つずつ実行
EXEC sp_rename 'users.first_name', 'given_name', 'COLUMN';
EXEC sp_rename 'users.last_name', 'family_name', 'COLUMN';
トランザクション内で実行:
BEGIN TRANSACTION;
EXEC sp_rename 'users.first_name', 'given_name', 'COLUMN';
EXEC sp_rename 'users.last_name', 'family_name', 'COLUMN';
COMMIT TRANSACTION;
【Oracle】カラム名の変更方法
Oracleでのカラム名変更方法を見ていきましょう。
標準的な構文
Oracleは標準SQLに準拠した構文を使います。
構文:
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名;
実例:
-- カラム名を変更
ALTER TABLE employees
RENAME COLUMN emp_name TO employee_name;
-- スキーマ付きで指定
ALTER TABLE hr.employees
RENAME COLUMN dept_id TO department_id;
Oracleの構文はPostgreSQLと似ていますね。
複数カラムの変更
Oracleでも複数のカラムを同時には変更できません。
実行方法:
-- 個別に実行
ALTER TABLE users
RENAME COLUMN first_name TO given_name;
ALTER TABLE users
RENAME COLUMN last_name TO family_name;
匿名PL/SQLブロックで実行:
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE users RENAME COLUMN first_name TO given_name';
EXECUTE IMMEDIATE 'ALTER TABLE users RENAME COLUMN last_name TO family_name';
END;
/
【SQLite】カラム名の変更方法
SQLiteでのカラム名変更方法も見ておきましょう。
ALTER TABLEによる変更(SQLite 3.25.0以降)
比較的新しいバージョンでは、標準的な構文が使えます。
構文:
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名;
実例:
ALTER TABLE users
RENAME COLUMN name TO full_name;
古いバージョンでの対応方法
SQLite 3.25.0より古いバージョンでは、テーブルの作り直しが必要です。
手順:
-- 1. 新しい構造のテーブルを作成
CREATE TABLE users_new (
user_id INTEGER PRIMARY KEY,
full_name TEXT, -- nameからfull_nameに変更
email TEXT
);
-- 2. データをコピー
INSERT INTO users_new (user_id, full_name, email)
SELECT user_id, name, email FROM users;
-- 3. 古いテーブルを削除
DROP TABLE users;
-- 4. テーブル名を戻す
ALTER TABLE users_new RENAME TO users;
少し手間がかかりますが、確実に変更できます。
実践的な変更例
実際の開発でよくあるケースを見ていきましょう。
例1:命名規則の統一
スネークケースに統一する場合。
変更前:
CREATE TABLE users (
userId INT,
firstName VARCHAR(50),
lastName VARCHAR(50),
emailAddress VARCHAR(100)
);
変更後:
-- MySQL 8.0以降の場合
ALTER TABLE users
RENAME COLUMN userId TO user_id,
RENAME COLUMN firstName TO first_name,
RENAME COLUMN lastName TO last_name,
RENAME COLUMN emailAddress TO email_address;
統一感のある命名に変更できます。
例2:より明確な名前に変更
曖昧なカラム名を具体的にする場合。
変更例:
-- dateをorder_dateに変更
ALTER TABLE orders
RENAME COLUMN date TO order_date;
-- statusをorder_statusに変更
ALTER TABLE orders
RENAME COLUMN status TO order_status;
-- idをorder_idに変更
ALTER TABLE orders
RENAME COLUMN id TO order_id;
カラム名が明確になり、可読性が向上します。
例3:データ型変更と同時に行う場合
MySQLのCHANGEを使えば、名前とデータ型を同時に変更できます。
実例:
-- priceをunit_priceに変更し、DECIMAL型に変更
ALTER TABLE products
CHANGE price unit_price DECIMAL(10, 2);
-- stock_countをquantityに変更し、UNSIGNED INTに変更
ALTER TABLE products
CHANGE stock_count quantity INT UNSIGNED NOT NULL DEFAULT 0;
データベース別の構文まとめ
各データベースの構文を比較表でまとめます。
| データベース | 構文 | 備考 |
|---|---|---|
| MySQL 8.0+ | ALTER TABLE t RENAME COLUMN old TO new; | 推奨 |
| MySQL全版 | ALTER TABLE t CHANGE old new 型; | データ型指定必須 |
| PostgreSQL | ALTER TABLE t RENAME COLUMN old TO new; | 標準SQL準拠 |
| SQL Server | EXEC sp_rename 't.old', 'new', 'COLUMN'; | ストアドプロシージャ使用 |
| Oracle | ALTER TABLE t RENAME COLUMN old TO new; | 標準SQL準拠 |
| SQLite 3.25+ | ALTER TABLE t RENAME COLUMN old TO new; | 比較的新しい機能 |
自分が使っているデータベースの構文を確認しましょう。
注意すべき重要なポイント
カラム名を変更する際の注意点をまとめます。
1. 依存オブジェクトへの影響
カラム名を変更すると、様々なオブジェクトに影響が出ます。
影響を受けるもの:
- ビュー(View)
- ストアドプロシージャ
- トリガー
- 関数
- アプリケーションのコード
確認方法:
-- PostgreSQLでビューの定義を確認
SELECT definition
FROM pg_views
WHERE viewname = 'view_name';
-- SQL Serverで依存関係を確認
SELECT * FROM sys.sql_expression_dependencies
WHERE referenced_entity_name = 'table_name';
事前に依存関係を確認し、必要に応じて修正しましょう。
2. インデックスとの関係
多くのデータベースでは、インデックスは自動的に更新されます。
自動更新されるデータベース:
- MySQL
- PostgreSQL
- SQL Server
- Oracle
ただし、念のため確認することをおすすめします。
インデックス確認(MySQL):
SHOW INDEX FROM table_name;
インデックス確認(PostgreSQL):
SELECT * FROM pg_indexes WHERE tablename = 'table_name';
3. 外部キー制約
外部キー制約も、通常は自動的に更新されます。
確認例(MySQL):
SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'your_table';
4. トランザクション内で実行
安全のため、トランザクションを使用しましょう。
推奨パターン:
BEGIN;
-- カラム名変更
ALTER TABLE users
RENAME COLUMN name TO full_name;
-- 確認
SELECT * FROM users LIMIT 5;
-- 問題なければコミット、問題あればロールバック
COMMIT; -- または ROLLBACK;
5. バックアップの取得
本番環境では必ずバックアップを取りましょう。
バックアップコマンド例:
MySQL:
mysqldump -u user -p database_name > backup.sql
PostgreSQL:
pg_dump -U user database_name > backup.sql
万が一の場合に備えることが大切です。
6. ダウンタイムの考慮
本番環境でのカラム名変更は、ダウンタイムが発生する可能性があります。
対策:
- メンテナンス時間帯に実行
- レプリケーションを活用
- ブルーグリーンデプロイメント
- アプリケーション側で旧カラム名と新カラム名の両方に対応
大規模なシステムでは慎重な計画が必要です。
よくあるエラーと対処法
実際に発生しやすいエラーと、その解決方法を紹介します。
エラー1:カラムが存在しない
エラーメッセージ例:
ERROR: column "old_name" does not exist
原因:
- カラム名のタイプミス
- 既に変更済み
対処法:
-- カラムの存在確認(MySQL)
SHOW COLUMNS FROM table_name;
-- カラムの存在確認(PostgreSQL)
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'your_table';
エラー2:新しいカラム名が既に存在する
エラーメッセージ例:
ERROR: column "new_name" already exists
原因:
- 同じ名前のカラムが既にある
対処法:
- 別の名前を考える
- 既存のカラムを確認して、必要なら先に削除または別名に変更
エラー3:権限不足
エラーメッセージ例:
ERROR: permission denied for table users
原因:
- ALTER権限がない
対処法:
-- 権限の付与(管理者が実行)
GRANT ALTER ON database_name.table_name TO 'user'@'host';
エラー4:テーブルがロックされている
エラーメッセージ例:
ERROR: could not obtain lock on table
原因:
- 他のセッションがテーブルを使用中
対処法:
- トランザクションを確認
- ロックしているプロセスを終了
- アクセスが少ない時間帯に実行
ロック確認(MySQL):
SHOW PROCESSLIST;
ロック確認(PostgreSQL):
SELECT * FROM pg_locks WHERE relation = 'table_name'::regclass;
アプリケーションコードの更新
カラム名を変更したら、アプリケーションコードも更新する必要があります。
段階的な移行戦略
ステップ1:旧カラム名を新カラム名にコピー
-- 新しいカラムを追加
ALTER TABLE users ADD COLUMN full_name VARCHAR(100);
-- データをコピー
UPDATE users SET full_name = name;
ステップ2:アプリケーションを更新
- 新カラム名を使用するようコードを変更
- 徐々にデプロイ
ステップ3:古いカラムを削除
-- すべてのアプリが更新されたら
ALTER TABLE users DROP COLUMN name;
この方法なら、ダウンタイムなしで移行できます。
ORM(オブジェクトリレーショナルマッピング)の更新
例:Ruby on Rails(マイグレーション)
class RenameNameToFullName < ActiveRecord::Migration[6.0]
def change
rename_column :users, :name, :full_name
end
end
例:Django(マイグレーション)
from django.db import migrations
class Migration(migrations.Migration):
operations = [
migrations.RenameField(
model_name='user',
old_name='name',
new_name='full_name',
),
]
ORMのマイグレーション機能を使うと便利です。
ベストプラクティス
カラム名変更のベストプラクティスをまとめます。
1. 事前準備
チェックリスト:
- [ ] バックアップの取得
- [ ] 依存オブジェクトの確認
- [ ] ダウンタイムの調整
- [ ] ロールバック手順の準備
- [ ] テスト環境での検証
2. 命名規則の統一
推奨される命名規則:
- スネークケース(snake_case)を使用
- 複数形と単数形を統一
- 予約語を避ける
- 意味のある名前を付ける
良い例:
user_id, first_name, email_address, created_at
悪い例:
uid, fn, email, date
3. ドキュメントの更新
カラム名を変更したら、必ずドキュメントも更新しましょう。
更新すべきもの:
- テーブル定義書
- ER図
- API仕様書
- 開発ドキュメント
4. チーム内での共有
変更内容をチームメンバーに確実に共有しましょう。
共有方法:
- マイグレーションスクリプトの提供
- Slack/メールでの通知
- ドキュメントの更新通知
よくある質問と回答
Q1. カラム名を変更すると、データは消える?
A. いいえ、データは消えません。カラム名を変更しても、格納されているデータはそのまま保持されます。データ型や制約も変わりません(MySQLのCHANGEで明示的に変更しない限り)。
Q2. 本番環境でカラム名を変更する際の注意点は?
A. 以下の点に注意してください:
- 必ずバックアップを取る
- メンテナンス時間帯に実行
- 依存するビューやプロシージャを確認
- アプリケーションコードも同時に更新
- ロールバック手順を準備
Q3. 複数のカラムを一度に変更できる?
A. データベースによります。MySQL 8.0以降なら可能ですが、PostgreSQLやOracleでは個別に実行する必要があります。ただし、トランザクション内で実行すれば、論理的には一括処理になります。
Q4. カラム名変更の処理時間はどれくらい?
A. 通常は数秒で完了します。カラム名の変更はメタデータの更新のみで、データ自体を移動するわけではないため、テーブルのサイズに関わらず高速です。ただし、テーブルロックが発生するため、アクセスが多い時間帯は避けましょう。
Q5. ビューやストアドプロシージャは自動的に更新される?
A. いいえ、自動更新されません。カラム名を参照しているビューやストアドプロシージャは手動で修正する必要があります。事前に依存関係を確認し、変更後に修正しましょう。
Q6. 外部キーで参照されているカラムは変更できる?
A. はい、可能です。多くのデータベースでは、外部キー制約も自動的に更新されます。ただし、念のため事前に確認し、テスト環境で検証することをおすすめします。
まとめ
SQLでカラム名を変更する方法についてまとめます。
データベース別の基本構文:
- MySQL 8.0+:
ALTER TABLE t RENAME COLUMN old TO new; - MySQL全版:
ALTER TABLE t CHANGE old new 型; - PostgreSQL:
ALTER TABLE t RENAME COLUMN old TO new; - SQL Server:
EXEC sp_rename 't.old', 'new', 'COLUMN'; - Oracle:
ALTER TABLE t RENAME COLUMN old TO new;
実行時の注意点:
- 必ずバックアップを取る
- 依存オブジェクトを確認する
- トランザクション内で実行する
- テスト環境で検証する
- チームに共有する
影響範囲:
- ビュー
- ストアドプロシージャ
- トリガー
- アプリケーションコード
カラム名の変更は比較的シンプルな操作ですが、システム全体に影響を与える可能性があります。慎重に計画を立て、手順を踏んで実行することが大切です。
この記事が、あなたのデータベース管理の役に立てば嬉しいです。安全なSQL操作を心がけてください!

コメント