使用MySQL 索引防止一个表中的一列或者多列产生重复值mysql
若是要强烈使一列或多列具备惟一性,一般使用PRIMARY KEY约束。 可是,每一个表只能有一个主键。 所以,若是使多个列或多个组合列具备惟一性,则不能使用主键约束。sql
幸运的是,MySQL提供了另外一种索引,叫作惟一索引,容许咱们可使一个或者多个列的值具备惟一性。另外,不会像主键索引同样,咱们的每张表中能够有不少个惟一索引数据库
为了建立一个惟一索引,咱们能够来使用CREATE UNIQUE INDEX语法:spa
若是想要在一个已存在表中添加一个惟一索引,咱们可使用下列的ALTER TABLE语句:code
ALTER TABLE table_name ADD INDEX index_name( column_1,column_2 ) ;
有一点值得注意下:
与其余数据库系统不一样,MySQL将NULL值视为不一样的值。因此,能够在惟一索引中包含不少的空值另外一个重点是UNIQUE约束不适用于除BDB存储引擎以外的NULL值。blog
假设咱们要管理应用程序中的联系人,而且还但愿联系人表的每一个联系人的电子邮件必须是惟一的。那咱们就可使用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 Index unique_email (email) );
咱们使用show indexes from contacts就可以看到mysql在email这一列中建立一个惟一的索引get
如今咱们向contacts表中插入一行数据来看下:table
INSERT INTO contacts(first_name,last_name,phone,email) VALUES('John','Doe','(408)-999-9765','john.doe@mysqltutorial.org');
如今咱们尝试插入一行email列中有john.doe@mysqltutorial.org, 这时咱们就会获得一个报错的信息。ast
INSERT INTO contacts(first_name,last_name,phone,email) VALUES('Johny','Doe','(408)-999-4321','john.doe@mysqltutorial.org');
报错以下:

假设咱们要一个first_name、last_name、phone的联合索引,咱们可使用下面的语法来获得:
CREATE UNIQUE INDEX idx_name_phone ON contacts(first_name,last_name,phone);
因此添加了 first_name, last_name, and phone已经存在的行,也是会形成错误的
INSERT INTO contacts(first_name,last_name,phone,email) VALUES('john','doe','(408)-999-9765','john.d@mysqltutorial.org');
报错以下:
还有个技巧,在设置好索引的状况下,把insert into 改成 insert ignore into,也可成功实现不重复插入相同数据,
与上面的区别是:上面会报错,加上ignore不会报错,运行结果只会提示------------ 受影响的行: 0
这样很是方便爬取数据的存储。
参考文章:https://zhuanlan.zhihu.com/p/76925239