MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】複数の列の組み合わせに一意制約(UNIQUE)を設定する方法

MySQLで列のペアを一意(ユニーク)にするには?

MySQLで2つ以上の列の組み合わせに対して一意性を持たせたい場合は、ALTER TABLEコマンドとUNIQUE制約を組み合わせて使用します。単一の列だけでなく、複数列をまとめて1つのユニークキーとして登録できるため、「名前と電話番号の組み合わせが重複してはならない」のような業務ルールをデータベースレベルで実現できます。

基本構文

ALTER TABLE テーブル名 ADD UNIQUE ユニーク制約名(列名1, 列名2, ...N);

この構文では、指定した複数の列を連結した値全体が一意である必要があります。つまり、個々の列の値が重複していても、組み合わせとして重複していなければINSERTは成功します。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> CREATE TABLE DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName varchar(100),
    StudentLastName varchar(100),
    StudentAge int,
    StudentPhoneNumber varchar(20)
);
Query OK, 0 rows affected (0.81 sec)

UNIQUE制約の追加

次に、StudentFirstName(名)とStudentPhoneNumber(電話番号)の2列の組み合わせに対して、一意制約を設定します。

mysql> ALTER TABLE DemoTable ADD UNIQUE DemoTable_unique_StudentFirstName_StudentPhoneNumber(StudentFirstName, StudentPhoneNumber);
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

これで「氏名+電話番号」の組み合わせが同じレコードは登録できなくなりました。

データの挿入と動作確認

INSERTコマンドを使って、いくつかレコードを挿入してみます。

mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber) VALUES('John','Doe',21,'9878567878');
Query OK, 1 row affected (0.18 sec)

mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber) VALUES('John','Smith',23,'7654674545');
Query OK, 1 row affected (0.14 sec)

1件目と2件目は、名前が同じ「John」でも電話番号が異なるため、問題なく登録できます。しかし、3件目で「John」と「9878567878」の組み合わせを再度挿入しようとすると、エラーが発生します。

mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber)
VALUES('John','Brown',21,'9878567878');
ERROR 1062 (23000): Duplicate entry 'John-9878567878' for key 'DemoTable_unique_StudentFirstName_StudentPhoneNumber'

このように、ERROR 1062 (23000): Duplicate entryという重複エラーが返され、INSERTが拒否されます。姓(StudentLastName)が異なる「Brown」であっても、ユニーク制約の対象となっている「名前+電話番号」の組み合わせが既に存在するためです。

登録済みデータの確認

SELECT文でテーブル内の全レコードを表示してみましょう。

mysql> SELECT * FROM DemoTable;

実行結果は以下の通りです。エラーになった3件目のデータは登録されておらず、2件のみが格納されていることがわかります。

+-----------+------------------+-----------------+------------+--------------------+
| StudentId | StudentFirstName | StudentLastName | StudentAge | StudentPhoneNumber |
+-----------+------------------+-----------------+------------+--------------------+
|         1 | John             | Doe             | 21         | 9878567878         |
|         2 | John             | Smith           | 23         | 7654674545         |
+-----------+------------------+-----------------+------------+--------------------+
2 rows in set (0.00 sec)

まとめ

  • 複数列の一意制約はALTER TABLE ~ ADD UNIQUE 制約名(列1, 列2, ...)で追加できる
  • 一意性が判定されるのは各列単体ではなく、指定した列の組み合わせ全体
  • 重複データを挿入しようとすると「ERROR 1062 (23000): Duplicate entry」が発生する
  • テーブル作成時(CREATE TABLE)にUNIQUE(列1, 列2)を定義しておく方法もある

  1. MySQLで一時テーブルの列(カラム)を一覧表示する方法

    MySQLで一時テーブル(TEMPORARY TABLE)の列を一覧表示するには、まず対象となる一時テーブルを作成しておく必要があります。ここでは例として、学生の詳細情報を格納する複数の列を持つ一時テーブルを作成してみましょう。mysql> CREATE TEMPORARY TABLE DemoTable745 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(100), StudentAge int, StudentAddress varchar(100),

  2. MySQLで複数の列を持つテーブルに条件を作成する方法|IF()関数の使い方を解説

    MySQLで条件分岐を実現するIF()関数とはMySQLで条件に応じて異なる値を返したい場合は、IF()関数を使用します。IF()関数は、指定した条件が真の場合と偽の場合で、それぞれ異なる値を返すことができる便利な関数です。IF()関数の基本構文IF(yourCondition, trueStatement, falseStatement);第1引数に条件式を指定し、条件が真(true)の場合は第2引数の値を、偽(false)の場合は第3引数の値を返します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable612 (N