JSONデータパターンからUNIQUE制約を生成する
コンバーターがJSON内の一意なフィールドを検出しSQL UNIQUE制約を生成する方法を学びます。単一カラムおよび複数カラムのユニークインデックスを解説。
Constraints
詳細な説明
ユニーク制約の検出
UNIQUE制約は、カラム(またはカラムの組み合わせ)で2つの行が同じ値を持たないことを保証します。コンバーターはフィールド名とサンプルデータを分析してユニーク候補を検出します。
JSON例
[
{ "id": 1, "username": "alice", "email": "alice@example.com", "name": "Alice" },
{ "id": 2, "username": "bob", "email": "bob@example.com", "name": "Bob" },
{ "id": 3, "username": "carol", "email": "carol@example.com", "name": "Carol" }
]
生成されるSQL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
CONSTRAINT uq_users_username UNIQUE (username),
CONSTRAINT uq_users_email UNIQUE (email)
);
検出ロジック
コンバーターは以下の方法でユニークカラムを識別します:
- 名前ベースの検出 —
email、username、slug、sku、code、ssn、phoneという名前のフィールドは一般的なユニーク候補です。 - サンプルデータ分析 — 複数のレコードが提供された場合、すべての値が異なるかチェックします。
- 複合ヒューリスティック — 既知のユニーク名を持ち、かつ個別のサンプル値を持つカラムにUNIQUE制約が付けられます。
UNIQUE vs PRIMARY KEY
| 特徴 | PRIMARY KEY | UNIQUE |
|---|---|---|
| NULL値 | 許可されない | 許可される(ほとんどのDBで1つのNULL) |
| テーブルごと | 1つのみ | 複数可 |
| インデックスの自動作成 | はい | はい |
| 目的 | 行の識別 | ビジネスルールの強制 |
複合ユニーク制約
ユニーク性がカラムの組み合わせに適用される場合もあります:
[
{ "user_id": 1, "role": "admin", "org_id": 10 },
{ "user_id": 1, "role": "viewer", "org_id": 10 },
{ "user_id": 1, "role": "admin", "org_id": 20 }
]
CONSTRAINT uq_user_org_role UNIQUE (user_id, role, org_id)
これにより、ユーザーが同じ組織で同じロールを2回持つことができなくなります。
部分ユニーク制約(PostgreSQL)
PostgreSQLは条件付きのユニーク性をサポートします:
CREATE UNIQUE INDEX uq_users_active_email
ON users (email)
WHERE is_active = TRUE;
これにより、そのメールアドレスを持つアクティブな行が1つだけであれば、重複したメールアドレスを許可します。論理削除パターンに有用です。
命名規則
uq_{テーブル}_{カラム}パターンを使用してください。複合制約の場合、カラム名をアンダースコアで結合します:uq_user_roles_user_id_org_id。
ユースケース
メールアドレスとユーザー名の両方が一意である必要があるユーザー登録システムを設計し、アプリケーションコードだけに頼るのではなく、データベースレベルでこれらのビジネスルールを強制する必要がある場合に使用します。