[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'