サンプルコード:MySQLで複数の列にユニーク制約を設定する

2024-04-02

MySQLで複数の列にユニーク制約を指定するには、UNIQUE制約を使用します。この制約は、指定された列の組み合わせがテーブル内で一意であることを保証します。

方法は2つあります。

CREATE TABLE ステートメントを使用する

CREATE TABLE テーブル名 (
  カラム名11,
  カラム名22,
  ...
  UNIQUE (カラム名1, カラム名2, ...)
);

CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(255) UNIQUE,
  email VARCHAR(255) UNIQUE
);

この例では、usersテーブルにはusernameemail列にユニーク制約が設定されています。つまり、同じusernameまたは同じemailを持つユーザーは2人以上登録できません。

既存のテーブルにユニーク制約を追加するには、ALTER TABLEステートメントを使用します。

ALTER TABLE テーブル名 ADD UNIQUE (カラム名1, カラム名2, ...);
ALTER TABLE users ADD UNIQUE (country, city);

この例では、usersテーブルにcountrycity列の組み合わせにユニーク制約を追加しています。

複合ユニーク制約を使用すると、単一の列よりも多くの情報に基づいてデータの重複を防ぐことができます。

注意点

  • 複合ユニーク制約を設定すると、インデックスが自動的に作成されます。
  • NULL値を含む行は、ユニーク制約の違反とは見なされません。
  • 複合ユニーク制約を変更する前に、その制約に依存する他のオブジェクト (たとえば、外部キー) を更新する必要があります。

補足

  • MySQL 5.7以降では、条件付きのユニーク制約を設定することもできます。
  • 複合ユニーク制約は、主キー制約と似ていますが、主キー制約はNULL値を許容しない点が異なります。



CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(255) UNIQUE,
  email VARCHAR(255) UNIQUE,
  country VARCHAR(255),
  city VARCHAR(255),
  UNIQUE (country, city)
);

この例では、usersテーブルには以下の列と制約が設定されています。

  • id: 主キー
  • username: ユニーク制約
  • country: 複合ユニーク制約の一部
CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(255),
  email VARCHAR(255)
);

ALTER TABLE users ADD UNIQUE (country, city);
  • email: なし

複合ユニーク制約の例

  • 同じ国に住む2人のユーザーは、同じ名前を持つことはできません。



複合ユニーク制約を指定するその他の方法

CREATE TABLE テーブル名 (
  カラム名11,
  カラム名22,
  ...
  UNIQUE KEY キー名 (カラム名1, カラム名2, ...)
);
CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(255),
  email VARCHAR(255),
  UNIQUE KEY ux_username (username),
  UNIQUE KEY ux_email (email)
);

この例では、usersテーブルにはusernameemail列にそれぞれユニークキーが設定されています。

PRIMARY KEY 制約を使用する

複合主キーは、複合ユニーク制約と同じように機能します。

CREATE TABLE テーブル名 (
  カラム名11,
  カラム名22,
  ...
  PRIMARY KEY (カラム名1, カラム名2, ...)
);
CREATE TABLE users (
  username VARCHAR(255),
  email VARCHAR(255),
  PRIMARY KEY (username, email)
);

CHECK 制約を使用する

CREATE TABLE テーブル名 (
  カラム名11,
  カラム名22,
  ...
  CHECK (カラム名1 IS NOT NULL AND カラム名2 IS NOT NULL AND CONCAT(カラム名1, カラム名2) UNIQUE)
);
CREATE TABLE users (
  username VARCHAR(255),
  email VARCHAR(255),
  CHECK (username IS NOT NULL AND email IS NOT NULL AND CONCAT(username, email) UNIQUE)
);
  • 複合ユニーク制約と複合主キーは、データの重複を防ぐために使用されます。
  • UNIQUE KEY 制約は、インデックスを作成するために使用されます。
  • CHECK 制約は、より複雑な制約を定義するために使用されます。
  • 複合ユニーク制約、複合主キー、UNIQUE KEY 制約は、NULL値を許容しません。
  • CHECK 制約は、NULL値を許容できます。

mysql unique-constraint composite-key


UNION ALL を使用して2つの候補テーブルを1つの仮想テーブルにまとめる

MySQLで、1つの列が2つの候補テーブルのいずれかのレコードを参照する必要がある外部キーを設定したい場合があります。解決策:MySQLでは、直接的に2つのテーブルに外部キーを設定することはできません。しかし、以下のいずれかの方法で実現できます。...


MySQL初心者でも安心!ターミナルでSELECT結果を分かりやすく表示する方法

MySQL の SELECT クエリで、結果として返されるフィールド数が非常に多い場合、ターミナルで綺麗に表示することが難しい場合があります。解決策:以下の方法を試すことで、ターミナルでの表示を改善することができます。特定のフィールドのみを選択する:...


MySQLで効率的な検索を実現する:B木とハッシュテーブルを使いこなす

MySQLをはじめとする多くのデータベースシステムでは、データを効率的に検索するためにインデックスと呼ばれるデータ構造が利用されます。インデックスは、データのキーとそれに関連する値の対応関係を保持し、キーに基づいた高速な検索を実現します。本記事では、2つの代表的なインデックス構造であるB木とハッシュテーブルについて、MySQLにおける実装とそれぞれの特性、使い分けについて詳しく解説します。...


MySQLとSQLの違いを徹底解説!プログラミング初心者でも分かるように

SQLとは?SQLはStructured Query Languageの略で、リレーショナルデータベースを操作するためのデータベース言語です。 データの追加、削除、更新、検索などを行うための命令を記述できます。例:新しい顧客情報を追加する特定の条件に合致する商品情報を検索する...