ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
カラム追加 (ADD COLUMN)
-- 基本: 末尾にカラム追加
ALTER TABLE users ADD COLUMN email VARCHAR(255);
-- NOT NULL + DEFAULT 必須 (既存行のため)
ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';
-- NULL 可なら DEFAULT 省略可
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL;
-- 複数カラムを一度に
ALTER TABLE users
ADD COLUMN first_name VARCHAR(100),
ADD COLUMN last_name VARCHAR(100);
-- 制約付き
ALTER TABLE users ADD COLUMN age INT CHECK (age >= 0);
ALTER TABLE users ADD COLUMN email VARCHAR(255) UNIQUE;
ALTER TABLE orders ADD COLUMN user_id BIGINT,
ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
カラム位置の指定 (MySQL のみ)
MySQL / MariaDB は AFTER / FIRST でカラム位置を指定できます。PostgreSQL / Oracle / SQL Server はテーブル末尾にしか追加できません:
-- MySQL: 既存カラムの後ろに
ALTER TABLE users ADD COLUMN nickname VARCHAR(50) AFTER name;
-- MySQL: 先頭に
ALTER TABLE users ADD COLUMN uuid CHAR(36) FIRST;
-- PostgreSQL: 位置指定不可 (常に末尾)
ALTER TABLE users ADD COLUMN nickname VARCHAR(50); -- 末尾のみ
-- PostgreSQL で順序を変えたい場合は: 新テーブル作成 → INSERT SELECT
-- → 旧テーブル DROP → 新テーブル RENAME
-- (実用上はカラム順序は気にせずビュー側で並べる)
カラム削除 (DROP COLUMN)
-- 1 カラム削除
ALTER TABLE users DROP COLUMN phone;
-- 複数削除
ALTER TABLE users
DROP COLUMN phone,
DROP COLUMN fax;
-- PostgreSQL は CASCADE で依存ビュー等も削除
ALTER TABLE users DROP COLUMN phone CASCADE;
-- IF EXISTS で安全に (PG/MySQL 8 で対応)
ALTER TABLE users DROP COLUMN IF EXISTS phone;
カラム型・名前変更
-- MySQL: MODIFY (型のみ変更)
ALTER TABLE users MODIFY COLUMN name VARCHAR(200) NOT NULL;
-- MySQL: CHANGE (名前+型変更)
ALTER TABLE users CHANGE COLUMN name full_name VARCHAR(200) NOT NULL;
-- PostgreSQL: 個別構文
ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(200);
ALTER TABLE users ALTER COLUMN name SET NOT NULL;
ALTER TABLE users ALTER COLUMN name DROP NOT NULL;
ALTER TABLE users ALTER COLUMN name SET DEFAULT 'unknown';
ALTER TABLE users RENAME COLUMN name TO full_name;
-- SQL Server
ALTER TABLE users ALTER COLUMN name VARCHAR(200) NOT NULL;
EXEC sp_rename 'users.name', 'full_name', 'COLUMN';
巨大テーブルでの注意
数千万行以上のテーブルで ALTER TABLE を実行すると、テーブルロックで数時間〜数日サービス停止することがあります。
| 操作 | MySQL 5.7 以前 | MySQL 8 Online DDL |
|---|---|---|
| NULL 可カラム追加 | テーブルコピー (長時間) | INSTANT (即時) |
| NOT NULL + DEFAULT カラム追加 | テーブルコピー | INSTANT (条件付き) |
| カラム削除 | テーブルコピー | INPLACE (行ロック無し) |
| カラム型変更 | テーブルコピー | INPLACE or COPY |
MySQL 8 Online DDL
-- INSTANT アルゴリズム指定 (一瞬で終わる)
ALTER TABLE users
ADD COLUMN nickname VARCHAR(100),
ALGORITHM=INSTANT;
-- INPLACE + LOCK=NONE で行ロック無し
ALTER TABLE users
ADD INDEX idx_email (email),
ALGORITHM=INPLACE,
LOCK=NONE;
-- 失敗時のフォールバック制御
ALTER TABLE users
DROP COLUMN deprecated_field,
ALGORITHM=INPLACE,
LOCK=NONE;
-- → サポート外操作だとエラー、明示することで意図しないテーブルコピーを防止
pt-online-schema-change / gh-ost (オンライン ALTER)
MySQL 5.7 以前や、Online DDL 非対応の操作には外部ツールを使います。新テーブルを作って差分を同期しながらコピー → 切替の仕組み:
# Percona Toolkit の pt-online-schema-change
pt-online-schema-change \
--alter "ADD COLUMN email VARCHAR(255)" \
D=mydb,t=users \
--execute
# GitHub の gh-ost (バイナリログベース、より安全)
gh-ost \
--database=mydb --table=users \
--alter="ADD COLUMN email VARCHAR(255)" \
--execute
# どちらも:
# 1. _users_new という新テーブル作成
# 2. 差分をトリガー or binlog で同期
# 3. 完了後 RENAME で切替
# 4. 旧テーブルを削除
ローリングデプロイの順序
本番運用中のサービスでカラムを変更する場合、アプリと DB の互換性を保つ必要があります。鉄則は「追加は先、削除は後」:
カラム追加
- DB 側: 新カラム追加 (NULL 可 or DEFAULT 付き) → 旧アプリはこのカラムを知らないが書き込みは成功
- アプリデプロイ: 新カラムを読み書きするコード
- 必要ならバックフィル (既存行に値を埋める UPDATE)
- NOT NULL 化が必要なら、ここで
ALTER ... NOT NULL
カラム削除
- アプリデプロイ: そのカラムを読み書きしないコードに変更
- 本番で問題ないことを確認 (数日〜1週間)
- DB 側: カラム削除
-- ❌ NG: アプリより先に DB のカラムを消す
ALTER TABLE users DROP COLUMN email;
-- → 旧バージョンのアプリが SELECT email でエラー連発
-- ✅ OK: アプリを先に「email を読まない」に更新してから DB DROP
-- (Blue/Green デプロイ・カナリアでも同様)
Laravel マイグレーションでの例
// php artisan make:migration add_email_to_users_table
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('email', 255)->nullable()->after('name');
$table->index('email');
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropIndex(['email']);
$table->dropColumn('email');
});
}
// 複数カラム削除
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['phone', 'fax']);
});
// 型変更 (要 doctrine/dbal)
Schema::table('users', function (Blueprint $table) {
$table->string('name', 200)->nullable(false)->change();
});
FAQ
Q: NOT NULL カラムを既存テーブルに追加できない
A: DEFAULT 値を必ず指定してください。ALTER TABLE t ADD col INT NOT NULL DEFAULT 0。既存行を埋める値が無いと失敗します。
Q: ALTER TABLE が終わらない
A: SHOW PROCESSLIST (MySQL) で進捗確認。Online DDL なら SELECT * FROM information_schema.innodb_alter_table_progress。長すぎる場合は kill して pt-online-schema-change に切替。
Q: カラム削除すると DB ファイルサイズが減らない
A: 多くの DB は「論理削除」のみ。物理的に小さくするには OPTIMIZE TABLE (MySQL) / VACUUM FULL (PostgreSQL) が必要。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?