使用MySQL UNIQUE索引防止重复
简介:在本教程中,您将学习如何使用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语句,您将看到MySQL为电子邮件列创建了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索引来防止数据库中的重复值。