使用MySQL UNIQUE索引防止重复

时间:2019-11-20 08:52:14  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL UNIQUE索引来防止表中一个或多个列中的重复值。

MySQL UNIQUE索引简介

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

幸运的是,MySQL提供了另一种称为UNIQUE索引的索引,它使您可以在一个或多个列中强制值的唯一性。
与PRIMARY KEY索引不同,每个表可以有多个UNIQUE索引。

要创建UNIQUE索引,请使用CREATE UNIQUE INDEX语句,如下所示:

CREATE UNIQUE INDEX index_name
ON table_name(index_column_1,index_column_2,...);

在一个或多个列中强制值唯一性的另一种方法是使用UNIQUE约束。

当创建UNIQUE约束时,MySQL在幕后创建UNIQUE索引。

以下语句说明了在创建表时如何创建唯一约束。

CREATE TABLE table_name(
...
   UNIQUE KEY(index_column_,index_column_2,...) 
);

在此语句中,您也可以使用UNIQUE INDEX代替UNIQUE KEY,因为它们是同义词。

如果要向现有表添加唯一约束,则可以使用ALTER TABLE语句,如下所示:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);

MySQL UNIQUE索引和NULL

与其他数据库系统不同,MySQL将NULL值视为不同的值。
因此,在UNIQUE索引中可以有多个NULL值。

这就是MySQL的设计方式。
即使它被报告为错误,它也不是错误。

另一个重要的一点是,除了BDB存储引擎之外,UNIQUE约束不适用于NULL值。

MySQL UNIQUE索引示例

假设您要管理应用程序中的联系人。
您还希望联系人表中每个联系人的电子邮件必须唯一。

要强制执行此规则,请在CREATE TABLE语句中创建一个唯一约束,如下所示:

CREATE TABLE IF NOT EXISTS contacts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    phone VARCHAR(15) NOT NULL,
    email VARCHAR(100) NOT NULL,
    UNIQUE KEY unique_email (email)
);

如果使用SHOW INDEXES语句,您将看到My​​SQL为电子邮件列创建了UNIQUE索引。

SHOW INDEXES FROM contacts;

让我们在通讯录中插入一行。

INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('John','Doe','(408)-999-9765','[email protected]');

现在,如果您尝试插入电子邮件为[email protected]的行,则会收到一条错误消息。

INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Johny','Doe','(408)-999-4321','[email protected]');
Error Code: 1062. Duplicate entry '[email protected]' for key 'unique_email'

假设您希望first_name,last_name和phone的组合在联系人中也是唯一的。
在这种情况下,您可以使用CREATE INDEX语句为这些列创建UNIQUE索引,如下所示:

CREATE UNIQUE INDEX idx_name_phone
ON contacts(first_name,last_name,phone);

将以下行添加到通讯录中会导致错误,因为first_name,last_name和phone的组合已存在。

INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('john','doe','(408)-999-9765','[email protected]');
Error Code: 1062. Duplicate entry 'john-doe-(408)-999-9765' for key 'idx_name_phone'

在本教程中,您学习了如何使用MySQL UNIQUE索引来防止数据库中的重复值。