SQLスキーマ定義の比較とマイグレーション変更の検出
2つのSQLスキーマ定義(CREATE TABLE文)を比較して、追加された列、変更された型、変更された制約、インデックスの変更を特定します。マイグレーション対応のALTER TABLE文を生成します。
Data Diff
詳細な説明
SQLスキーマのDiff
SQLスキーマ定義の比較は、データベース管理者や開発者がスキーマバージョン間の変更を理解し、マイグレーションスクリプトを生成し、マイグレーションが期待通りの結果を生成することを検証するのに役立ちます。
スキーマ比較の例
-- バージョンA
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- バージョンB
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
role ENUM('admin', 'user') DEFAULT 'user',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
検出された変更
テーブル: users
変更: id INT → BIGINT
変更: email NOT NULL制約を追加
+ 追加: role ENUM('admin','user') DEFAULT 'user'
+ 追加: updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
スキーマ変更のタイプ
| 変更タイプ | 例 | マイグレーションリスク |
|---|---|---|
| 列追加 | 新しいrole列 |
低 — NULLableまたはデフォルト値あり |
| 列削除 | legacy_fieldを削除 |
高 — データ損失 |
| 型変更 | INT → BIGINT | 中 — データ変換が必要な場合 |
| 制約追加 | NOT NULLを追加 | 高 — 既存のNULLがマイグレーションをブロック |
| インデックス追加 | emailに新しいインデックス |
低 — 大きなテーブルでは遅い可能性 |
| デフォルト値変更 | DEFAULT値の変更 | 低 |
| テーブル追加 | 新しいaudit_logテーブル |
低 |
| テーブル削除 | temp_dataを削除 |
高 — データ損失 |
マイグレーションスクリプトの生成
上記のDiffからALTER TABLEスクリプトを生成できます:
ALTER TABLE users MODIFY COLUMN id BIGINT AUTO_INCREMENT;
ALTER TABLE users MODIFY COLUMN email VARCHAR(255) UNIQUE NOT NULL;
ALTER TABLE users ADD COLUMN role ENUM('admin', 'user') DEFAULT 'user' AFTER email;
ALTER TABLE users ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
クロスデータベース互換性
データベースによってDDL構文が異なります。スキーマDiffツールはDialectを理解する必要があります:
- MySQL: AUTO_INCREMENT、ENUM、MODIFY COLUMN
- PostgreSQL: SERIAL、ALTER COLUMN ... TYPE、カスタム型
- SQLite: 限定的なALTER TABLEサポート
ユースケース
SQLスキーマDiffはデータベースマイグレーションワークフローに不可欠です。開発者はマイグレーション実行前のスキーマ変更のレビュー、ORMモデル変更からのALTER TABLE文の生成、開発と本番のスキーマ比較によるドリフトの検出、自動マイグレーションツール(Flyway、Liquibase、Prisma Migrate)が正しい結果を生成するかの検証に使用します。