ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
MySQL での ALTER TABLE
型・属性の変更(MODIFY)
-- 型変更
ALTER TABLE users MODIFY name VARCHAR(255);
-- 型 + NOT NULL + DEFAULT 一括
ALTER TABLE users MODIFY name VARCHAR(255) NOT NULL DEFAULT '';
-- カラム位置移動
ALTER TABLE users MODIFY name VARCHAR(255) AFTER id;
ALTER TABLE users MODIFY name VARCHAR(255) FIRST;
-- 文字コード変更
ALTER TABLE users MODIFY name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
リネーム + 型変更(CHANGE)
-- 名前を変える時は CHANGE
ALTER TABLE users CHANGE username name VARCHAR(255) NOT NULL;
-- old_name new_name 型 ... の順
-- MySQL 8.0+ は RENAME COLUMN もサポート
ALTER TABLE users RENAME COLUMN username TO name;
-- 複数まとめて変更
ALTER TABLE users
MODIFY name VARCHAR(255) NOT NULL,
CHANGE email mail VARCHAR(255) NOT NULL,
ADD COLUMN phone VARCHAR(20),
DROP COLUMN deleted_at;
デフォルト値の変更
-- デフォルト値追加
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';
-- デフォルト値削除
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
-- NOT NULL 追加(既存 NULL があるとエラー → 先に UPDATE で埋める)
UPDATE users SET status = 'active' WHERE status IS NULL;
ALTER TABLE users MODIFY status VARCHAR(20) NOT NULL DEFAULT 'active';
-- NOT NULL 削除
ALTER TABLE users MODIFY status VARCHAR(20) NULL;
PostgreSQL での ALTER TABLE
-- 型変更
ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(255);
-- USING で明示変換が必要なケース
ALTER TABLE users ALTER COLUMN age TYPE INTEGER USING age::INTEGER;
ALTER TABLE logs ALTER COLUMN created_at TYPE TIMESTAMPTZ
USING created_at AT TIME ZONE 'UTC';
-- リネーム
ALTER TABLE users RENAME COLUMN username TO name;
-- デフォルト値
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
-- NOT NULL
ALTER TABLE users ALTER COLUMN status SET NOT NULL;
ALTER TABLE users ALTER COLUMN status DROP NOT NULL;
-- 一気に複数操作
ALTER TABLE users
ALTER COLUMN name TYPE VARCHAR(255),
ALTER COLUMN status SET DEFAULT 'active',
ALTER COLUMN status SET NOT NULL;
SQL Server / Oracle
-- SQL Server
ALTER TABLE users ALTER COLUMN name VARCHAR(255) NOT NULL;
EXEC sp_rename 'users.username', 'name', 'COLUMN';
ALTER TABLE users ADD CONSTRAINT df_status DEFAULT 'active' FOR status;
-- Oracle
ALTER TABLE users MODIFY (name VARCHAR2(255) NOT NULL);
ALTER TABLE users RENAME COLUMN username TO name;
ALTER TABLE users MODIFY (status DEFAULT 'active');
ALTER TABLE users MODIFY (status DEFAULT NULL); -- DEFAULT 削除
カラム追加・削除
-- 追加
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email; -- MySQL
ALTER TABLE users ADD COLUMN phone VARCHAR(20) DEFAULT NULL;
-- 削除
ALTER TABLE users DROP COLUMN phone;
-- 複数追加(MySQL)
ALTER TABLE users
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address TEXT,
ADD COLUMN birthdate DATE;
巨大テーブルでの問題点
10 億行あるテーブルで ALTER TABLE を実行すると:
- 処理に数時間〜数日かかる
- その間テーブルが書き込みロックされる(DB により差)
- 失敗するとロールバックでさらに時間
- レプリケーション遅延
MySQL Online DDL の進化
| バージョン | 状況 |
|---|---|
| 5.5 以前 | テーブル全体ロック → 読み書き全停止 |
| 5.6 | Online DDL 導入。インデックス追加等は読み書き継続可能 |
| 5.7 | Online DDL 対象拡大 |
| 8.0 | INSTANT ADD COLUMN(瞬時カラム追加、データ書き換えなし) |
| 8.0.29+ | INSTANT DROP / RENAME カラム |
-- MySQL 8.0+ の INSTANT は数ミリ秒で完了
ALTER TABLE big_table ADD COLUMN flag TINYINT, ALGORITHM=INSTANT;
-- アルゴリズムを明示
-- ALGORITHM=COPY - 旧式、全行コピー(最遅、最確実)
-- ALGORITHM=INPLACE - 既存テーブルを変更、読み書き継続可(多くの場合)
-- ALGORITHM=INSTANT - メタデータのみ変更、即時完了(限定操作)
-- LOCK レベル
-- LOCK=NONE - 読み書きとも継続可
-- LOCK=SHARED - 読みのみ可
-- LOCK=EXCLUSIVE - 全停止
ALTER TABLE big_table
ADD COLUMN flag TINYINT,
ALGORITHM=INPLACE, LOCK=NONE;
pt-online-schema-change(Percona Toolkit)
MySQL の Online DDL でも対応できない変更(型変換等)には、pt-online-schema-change または gh-ost を使います。
# 仕組み: 新テーブルを作る → トリガで同期 → 旧データをコピー → アトミック RENAME
# インストール (Ubuntu)
sudo apt install percona-toolkit
# ALTER 実行
pt-online-schema-change \
--alter "MODIFY name VARCHAR(500) NOT NULL" \
--execute \
h=localhost,D=mydb,t=users,u=root,p=secret
# dry-run(実行しない確認のみ)
pt-online-schema-change \
--alter "MODIFY name VARCHAR(500) NOT NULL" \
--dry-run \
h=localhost,D=mydb,t=users
# 注意:
# 外部キーで参照されているテーブルは制約処理が複雑
# --alter-foreign-keys-method=auto / drop_swap / rebuild_constraints
gh-ost(GitHub 製)
pt-online-schema-change の代替。トリガを使わずbinlog を読んで同期するため、本番への影響が小さいのが特徴:
gh-ost \
--user=root --password=secret \
--host=localhost \
--database=mydb \
--table=users \
--alter="MODIFY name VARCHAR(500) NOT NULL" \
--execute
# dry-run
gh-ost ... --execute=false
# レプリカでスロットリング自動制御
gh-ost ... --max-lag-millis=1500
PostgreSQL での巨大テーブル変更
-- PostgreSQL 11+ : 多くの ALTER がインスタント完了
-- DEFAULT 追加もテーブル書換不要
ALTER TABLE big_table ADD COLUMN flag BOOLEAN DEFAULT FALSE NOT NULL;
-- 型変更で全行書換が起きるケース(重い)
ALTER TABLE big_table ALTER COLUMN id TYPE BIGINT;
-- → テーブル全コピー、ACCESS EXCLUSIVE ロック
-- 安全策: 一時カラム経由
ALTER TABLE big_table ADD COLUMN id_new BIGINT;
UPDATE big_table SET id_new = id WHERE id_new IS NULL; -- 分割実行
-- ... トリガで新規 INSERT も同期 ...
ALTER TABLE big_table DROP COLUMN id;
ALTER TABLE big_table RENAME COLUMN id_new TO id;
-- pg_repack でテーブル再構成(要拡張)
-- pg_repack -t big_table -d mydb
Laravel マイグレーションでの変更
// doctrine/dbal が必要
// composer require doctrine/dbal
Schema::table('users', function (Blueprint $table) {
$table->string('name', 255)->nullable()->change(); // 型・NULL 変更
$table->renameColumn('username', 'name'); // リネーム
$table->string('status')->default('active')->change(); // デフォルト値
$table->dropColumn('deleted_at');
});
変更前のチェックリスト
- 本番のテーブル行数を
EXPLAINで確認(数千万行以上ならオンライン DDL ツール検討) - レプリケーション遅延が許容範囲か
- 外部キーが絡む場合は手順を整理
- 失敗時のロールバック計画
- 新カラムに NOT NULL を付けるなら先にデータを埋めるか DEFAULT を指定
- 本番投入前にステージング環境で時間計測
FAQ
Q: ALTER TABLE が終わらない
A: SHOW PROCESSLIST で進捗確認。中止したい場合は KILL [thread_id]。途中キャンセル後はテーブル整合性確認を。
Q: NOT NULL を後から追加してエラー
A: 既存に NULL 行があると失敗。先に UPDATE t SET col = 'デフォルト値' WHERE col IS NULL を実行してから ALTER。
Q: カラム順序を変えたい(MySQL)
A: MODIFY col 型 AFTER 他のカラム または FIRST。MySQL のみ対応。PostgreSQL は順序変更不可(不要な設計上の理由)。
Q: 巨大テーブルで型変更を確実に安全に
A: 新カラム追加 → トリガ / アプリで二重書き込み → バッチで埋め戻し → 旧カラム削除、の段階的アプローチが最も安全。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
コメントを削除してもよろしいでしょうか?