📅  最后修改于: 2020-11-17 02:36:27             🧑  作者: Mango
索引编制是将无序列表查找到有序列表的过程,使我们可以更快地检索记录。它为出现在索引列中的每个值创建一个条目。在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将自动为此列生成一个名称。
唯一索引和空
MySQL中的NULL值会考虑与其他数据库相似的不同值。因此,我们可以在UNIQUE索引列中存储多个NULL值。 MySQL的此功能有时被报告为错误,但不是错误。
让我们借助示例了解它。假设我们要在需要唯一电子邮件列的数据库应用程序中管理员工详细信息。执行以下语句,以创建具有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也唯一。在这种情况下,我们将使用以下语句为这些列创建UNIQUE索引:
CREATE UNIQUE INDEX index_name_phone
ON Employee_Detail (Name, Phone);
如果再次执行SHOW INDEX语句,我们可以看到MySQL为name和phone列创建了UNIQUE索引index_name_phone。
将此记录添加到表中会产生错误。这是因为名称和电话的组合已经存在。
mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)
VALUES (4, 'Joseph', 'joseph@javatpoint.com', '09896765374', 'Texas');
查看以下输出: