MySQL 如果我多次在同一列上添加唯一约束会发生什么?

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将在我们对该列添加唯一约束的次数上创建唯一索引。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程