MySQL 如果我多次在同一列上添加唯一约束会发生什么?
如果我们在同一列上多次添加唯一约束,则MySQL将为我们添加唯一约束的次数在该列上创建索引。
阅读更多:MySQL 教程
示例
假设我们有一个名为“employee”的表,在其中我们在“empid”列上设置了唯一约束。可以通过以下查询检查它:-
mysql> Describe employee;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| empid | int(11) | YES | UNI | NULL | |
| first_name | varchar(20) | YES | | NULL | |
| last_name | varchar(20) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.12 sec)
现在,当我们运行SHOW INDEX查询时,它只会给出在“empid”列上创建的索引的名称。
mysql> Show index from employee\G;
*************************** 1. row ***************************
Table: employee
Non_unique: 0
Key_name: empid
Seq_in_index: 1
Column_name: empid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
通过以下查询,我们在同一列“empid”上添加了另一个唯一约束:-
mysql> Alter table employee ADD UNIQUE(empid);
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
现在,当我们运行SHOW INDEX查询时,它会给出在“empid”列上创建的两个索引“empid”和“empid_2”的名称。
mysql> Show index from employee12\G;
*************************** 1. row ***************************
Table: employee
Non_unique: 0
Key_name: empid
Seq_in_index: 1
Column_name: empid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: employee
Non_unique: 0
Key_name: empid_2
Seq_in_index: 1
Column_name: empid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
通过以下查询,我们在同一列“empid”上再次添加了一个唯一约束:-
mysql> Alter table employee ADD UNIQUE(empid);
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
现在,当我们运行SHOW INDEX查询时,它会给出在“empid”列上创建的三个索引“empid”、“empid_2”和“empid_3”的名称。
mysql> ALTER TABLE employee ADD UNIQUE(empid);
查询 OK,受影响行数为 0 (用时 0.30 秒)
记录数:0 重复数:0 警告数:0
mysql> SHOW INDEX FROM employee\G;
*************************** 1. 行 ***************************
表:employee
非唯一:0
键名:empid
在索引中位置:1
列名:empid
排列顺序:A
基数:0
子部分:NULL
包装:NULL
允许:YES
索引类型:BTREE
注释:
索引注释:
*************************** 2. 行 ***************************
表:employee
非唯一:0
键名:empid_2
在索引中位置:1
列名:empid
排列顺序:A
基数:0
子部分:NULL
包装:NULL
允许:YES
索引类型:BTREE
注释:
索引注释:
*************************** 3. 行 ***************************
表:employee
非唯一:0
键名:empid_3
在索引中位置:1
列名:empid
排列顺序:A
基数:0
子部分:NULL
包装:NULL
允许:YES
索引类型:BTREE
注释:
索引注释:
查询返回了 3 行(用时 0.00 秒)
从这个意义上讲,我们可以说MySQL将在我们对该列添加唯一约束的次数上创建唯一索引。
极客教程