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)が正しい結果を生成するかの検証に使用します。

試してみる — Diff Viewer

フルツールを開く