0Pricing
SQL Academy · レッスン

UNIQUE制約と複合キー

単一列または複数列の一意性を保証し、一意インデックスにおけるNULLの扱いを理解し、自然キーには複合一意性を使います。

「UNIQUE制約と複合キー」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

UNIQUE:重複を許可しない

UNIQUE制約は、制約対象の列で同じ値を共有する2つの行が存在することを禁止します。

CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  username VARCHAR(50) UNIQUE
);

UNIQUEはインデックスを作成する

UNIQUE制約は一意B-treeインデックスで実装されるため、その列による検索は高速です。

-- This shows the implicit index:
SELECT indexname FROM pg_indexes WHERE tablename = 'users';

複合UNIQUE

複数の列の組み合わせに対して一意性を適用します。

CREATE TABLE memberships (
  user_id BIGINT NOT NULL,
  group_id BIGINT NOT NULL,
  role TEXT NOT NULL,
  UNIQUE (user_id, group_id)        -- a user can be in a group at most once
);

UNIQUEとPRIMARY KEYの違い

主キーは基本的に、UNIQUE + NOT NULL + 識別子としての指定です。テーブルに設定できる主キーは1つですが、UNIQUE制約は複数設定できます。

UNIQUEにおけるNULL

標準SQLでは、NULLは他のすべての値(別のNULLを含む)とは異なる値として扱われます。そのため、UNIQUE列に複数のNULL行を含めることができます。

CREATE TABLE invites (email VARCHAR(255) UNIQUE);
INSERT INTO invites VALUES (NULL), (NULL);   -- both succeed

-- PostgreSQL 15+ offers UNIQUE NULLS NOT DISTINCT to treat NULL as equal:
CREATE TABLE invites2 (email VARCHAR(255) UNIQUE NULLS NOT DISTINCT);

複合主キー

自然な複合キーが適している場合は、それをPRIMARY KEYとして使用します。

CREATE TABLE order_items (
  order_id   BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
  product_id BIGINT NOT NULL REFERENCES products(id),
  quantity   INT NOT NULL CHECK (quantity > 0),
  PRIMARY KEY (order_id, product_id)
);

サロゲートキー + UNIQUEな自然キー

よく使われるパターンは、合成したidを主キーにし、現実世界での一意性をUNIQUEで保証する方法です。

CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  sku VARCHAR(50) NOT NULL UNIQUE,
  name TEXT NOT NULL
);

部分UNIQUEインデックス

一部の行の間だけで一意性を適用します。

-- One active email per user (deleted users can re-register):
CREATE UNIQUE INDEX users_active_email_idx
  ON users (email)
  WHERE deleted_at IS NULL;

式を使ったUNIQUEインデックス

計算された式に対して一意性を適用します。大文字と小文字を区別しないメールアドレスに便利です。

CREATE UNIQUE INDEX users_email_ci_idx ON users (LOWER(email));

UNIQUE違反エラー

重複したINSERTを実行すると、次の結果が返されます。

ERROR:  duplicate key value violates unique constraint "users_email_key"
DETAIL:  Key (email)=(alice@example.com) already exists.

UPSERTはUNIQUEを基盤にする

ON CONFLICTで対象を指定するにはUNIQUEまたはPRIMARY KEYが必要です。これにより、PostgreSQLは何を重複とみなすかを判断できます。

まとめ

UNIQUEは、NOT NULLに次いで重要な制約です。

  • 単一列または複合列に設定できます
  • 「アクティブな行の間だけ」に適用するには部分UNIQUEを使用します
  • 大文字と小文字を区別しないキーには式を使ったUNIQUEを使用します
  • NULLは異なる値として扱われるルールに注意します

理解度チェック

標準SQLでは、UNIQUE列に複数のNULL値を含めることができますか。

よくある質問

「UNIQUE制約と複合キー」レッスンは無料ですか?

はい。「UNIQUE制約と複合キー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「UNIQUE制約と複合キー」で何を学びますか?

単一列または複数列の一意性を保証し、一意インデックスにおけるNULLの扱いを理解し、自然キーには複合一意性を使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「UNIQUE制約と複合キー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. NOT NULLとCHECK制約
  2. UNIQUE制約と複合キー
  3. FOREIGN KEYと参照アクション
  4. DEFAULT値と生成列
← SQL Academyに戻る