MySQL 唯一索引
索引是将无序列表查找到有序列表中的过程,使我们可以更快地检索记录。
它为出现在索引列中的每个值创建一个条目 。在MySQL中搜索表时,它有助于最大程度地提高查询效率。没有索引,我们需要扫描整个表以找到相关信息。 MySQL索引的工作方式与书籍索引相似。
通常,我们使用主键约束来强制一个或多个列的唯一性值。但是,每个表只能使用一个主键。因此,如果我们要创建具有唯一值的多组列,则将不使用主键约束。
MySQL 允许另一个称为
UNIQUE INDEX 的约束来强制一个或多个列中值的唯一性。我们可以在一个表中创建多个UNIQUE索引,这对于主键约束是不可能的。
语法
以下是使用的通用语法在MySQL表中创建唯一索引:
CREATE UNIQUE INDEX index_name
ON table_name (index_column1, index_column2,...);
MySQL允许使用UNIQUE Key语句在一个或多个列中强制执行唯一性值的另一种方法。我们可以在此处阅读有关 UNIQUE KEY 的更多信息。
如果我们使用UNIQUE约束在表中,MySQL在幕后自动创建一个UNIQUE索引。以下语句说明了在创建表时如何创建唯一约束。
CREATE TABLE table_name(
col1 col_definition,
col2 col_definition,
...
[CONSTRAint constraint_name]
UNIQUE Key (column_name(s))
);
注意: 建议在创建表时使用约束名称。如果我们省略约束名称,MySQL将自动为此列生成一个名称。
UNIQUE索引和NULL
MySQL中的NULL值考虑了与其他数据库相似的不同值。因此,我们可以在UNIQUE索引列中存储多个NULL值。 MySQL的此功能有时被报告为错误,但不是错误。
MySQL UNIQUE索引示例
让我们借助示例来理解它。假设我们要在需要唯一电子邮件列的数据库应用程序中管理员工详细信息。执行以下语句,以创建具有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@lidihuo.com', '49562959223', 'Texas'),
(2, 'Suzi', 'suzi@lidihuo.com', '70679834522', 'California'),
(3, 'Joseph', 'joseph@lidihuo.com', '09896765374', 'Alaska');
由于所有列都是唯一的,因此上述语句成功执行。如果我们插入电子邮件为
suzi@lidihuo.com 的记录,则会收到重复的错误消息。
mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)
VALUES (2, 'Suzi', 'suzi@lidihuo.com', '70679834522', 'Texas');
以下输出更清楚地说明了上述所有步骤:
假设我们希望Employee_Detail表的
名称和
电话也是唯一的。在这种情况下,我们将使用以下语句为这些列创建UNIQUE索引:
CREATE UNIQUE INDEX index_name_phone
ON Employee_Detail (Name, Phone);
如果再次执行
SHOW INDEX 语句,我们可以看到MySQL还为名称和电话列创建了UNIQUE索引
index_name_phone 。
将此记录添加到表中会产生错误。这是因为名称和电话的组合已经存在。
mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)
VALUES (4, 'Joseph', 'joseph@lidihuo.com', '09896765374', 'Texas');
查看以下输出: