MySQL 唯一索引

索引是将无序列表查找到有序列表中的过程,它允许我们更快地检索记录。它为出现在索引列中的每个值创建一个条目。它有助于在 MySQL 中搜索表时最大限度地提高查询效率。在没有索引的情况下,我们需要扫描整个表以查找相关信息。MySQL 索引的工作原理类似于书籍索引。

通常,我们使用主键约束来强制一个或多个列的唯一性值。但是,我们只能为每个表使用一个主键。因此,如果我们要使多组列具有唯一值,则不会使用主键约束。

MySQL允许另一个称为UNIQUE INDEX的约束来强制一个或多个列中值的唯一性。我们可以在一张表中创建多个 UNIQUE 索引,这在主键约束下是不可能的。

一、MySQL 唯一索引 语法

以下是用于在 MySQL 表中创建唯一索引的通用语法:

CREATE UNIQUE INDEX index_name  
ON table_name (index_column1, index_column2,...);  

MySQL 允许使用 UNIQUE Key 语句在一个或多个列中强制执行唯一性值的另一种方法。

如果我们在表中使用 UNIQUE 约束,MySQL 会在后台自动创建一个 UNIQUE 索引。以下语句解释了我们在创建表时如何创建唯一约束。

CREATE TABLE table_name(    
  col1 col_definition,    
  col2 col_definition,    
  ...    
  [CONSTRAINT constraint_name]    
  UNIQUE Key (column_name(s))    
);  

注意:建议在创建表时使用约束名称。如果我们省略约束名称,MySQL 会自动为该列生成一个名称。

唯一索引和 NULL

MySQL 中的 NULL 值考虑类似于其他数据库的不同值。因此,我们可以在 UNIQUE 索引列中存储多个 NULL 值。MySQL 的这个特性有时会报告为 bug,但它不是 bug。

二、MySQL 唯一索引 示例

让我们借助一个例子来理解它。假设我们要在需要唯一Email列的数据库应用程序中管理员工详细信息。执行以下语句,创建具有 UNIQUE 约束的表“Employee_Detail” :

CREATE TABLE Employee_Detail(    
    ID int AUTO_INCREMENT PRIMARY KEY,     
    Name varchar(45),     
    Email varchar(45),    
    Phone varchar(15),     
    City varchar(25),  
    UNIQUE KEY unique_email (Email)  
);  

如果我们执行下面的语句,我们可以看到 MySQL 为 Employee_Detail 表的Email列创建了一个 UNIQUE 索引:

SHOW INDEXES FROM Employee_Detail;  

在下面的界面中,我们可以看到 Email 列被创建为唯一索引。

接下来,我们将使用以下语句向表中插入记录:

INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)    
VALUES (1, 'Peter', 'peter@javatpoint.com', '49562959223', 'Texas'),    
(2, 'Suzi', 'suzi@javatpoint.com', '70679834522', 'California'),    
(3, 'Joseph', 'joseph@javatpoint.com', '09896765374', 'Alaska');  

上述语句执行成功,因为所有列都是唯一的。如果我们插入一条电子邮件为suzi@javatpoint.com的记录,我们将收到重复的错误消息。

mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)   
VALUES (2, 'Suzi', 'suzi@javatpoint.com', '70679834522', 'Texas'); 

以下输出更清楚地解释了上述所有步骤:

假设我们希望 Employee_Detail 表的Name和Phone也是唯一的。在这种情况下,我们将使用以下语句为这些列创建唯一索引:

CREATE UNIQUE INDEX index_name_phone  
ON Employee_Detail (Name, Phone);  

如果我们再次执行 SHOW INDEX 语句,我们可以看到 MySQL也为 name 和 phone 列创建了一个唯一索引index_name_phone 。

将此记录添加到表中会产生错误。这是因为Name和Phone的组合已经存在。

mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)   
VALUES (4, 'Joseph', 'joseph@javatpoint.com', '09896765374', 'Texas');    

查看此输出:

热门文章

优秀文章