索引是将无序列表查找到有序列表中的过程,它使我们能够更快地检索记录。它为索引列中出现的每个值创建一个条目\。它有助于在 MySQL 中搜索表时最大限度地提高查询效率。在没有索引的情况下,我们需要扫描整个表才能找到相关信息。MySQL 索引的工作类似于书籍索引。
通常,我们使用主键约束来强制一列或多列的唯一性值。但是,我们只能为每个表使用一个主键。所以如果我们想制作多组具有唯一值的列,就不会使用主键约束。
MySQL允许另一个称为UNIQUE INDEX 的约束来强制一个或多个列中值的唯一性。我们可以在一个表中创建多个 UNIQUE 索引,这对于主键约束是不可能的。
句法
以下是用于在 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 的这个特性有时被报告为一个错误,但它不是一个错误。
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@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 列创建了一个唯一索引index_name_phone。
将此记录添加到表中会产生错误。这是因为名称和电话的组合已经存在。
mysql> INSERT INTO Employee_Detail(ID, Name, Email, Phone, City)
VALUES (4, 'Joseph', 'joseph@javatpoint.com', '09896765374', 'Texas');
看看这个输出: