[MySQL] UNIQUE制約を設定する

MySQL で UNIQUE 制約(一意制約)を設定します。この制約により、同じ値を登録できなくすることができます。

ユニーク制約の追加・削除・確認方法

追加する

ALTER TABLE table_name ADD UNIQUE key_name (column_name);

削除する

ALTER TABLE table_name DROP INDEX key_name;

確認する

SHOW INDEXES FROM table_name;

CREATE TABLE で設定する例

CREATE TABLE `users` (
  `email` varchar(100) NOT NULL,
  `name` varchar(100) NOT NULL,
  UNIQUE KEY `uq_email` (`email`)
);

実際の動作

CREATE TABLE users (
  email VARCHAR(100),
  name VARCHAR(100)
);
ALTER TABLE users ADD UNIQUE uq_email (email);
SHOW INDEXES FROM users;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| users |          0 | uq_email |            1 | email       | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

データを追加してみます。email-a、email-b という値は追加できましたが、再度 email-a という値を追加しようとするとエラーとなります。

MySQL [db]> INSERT INTO users (email) VALUES ('email-a');
Query OK, 1 row affected (0.00 sec)

MySQL [db]> INSERT INTO users (email) VALUES ('email-b');
Query OK, 1 row affected (0.02 sec)

MySQL [db]> INSERT INTO users (email) VALUES ('email-a');
ERROR 1062 (23000): Duplicate entry 'email-a' for key 'uq_email'

MySQLMySQL

Posted by kidatti