使用MySQL 索引防止一個表中的一列或者多列產生重復值
一:介紹MYSQL唯一索引
如果要強烈使一列或多列具有唯一性,通常使用PRIMARY KEY約束。 但是,每個表只能有一個主鍵。 因此,如果使多個列或多個組合列具有唯一性,則不能使用主鍵約束。
幸運的是,MySQL提供了另一種索引,叫做唯一索引,允許我們可以使一個或者多個列的值具有唯一性。另外,不會像主鍵索引一樣,我們的每張表中可以有很多個唯一索引
為了創建一個唯一索引,我們可以來使用CREATE UNIQUE INDEX語法:
如果想要在一個已存在表中添加一個唯一索引,我們可以使用下列的ALTER TABLE語句:
ALTER TABLE table_name ADD INDEX index_name( column_1,column_2 ) ;
有一點值得注意下:
與其他數據庫系統不同,MySQL將NULL值視為不同的值。所以,可以在唯一索引中包含很多的空值另一個重點是UNIQUE約束不適用於除BDB存儲引擎之外的NULL值。
二:MySQL唯一索引舉例
假設我們要管理應用程序中的聯系人,並且還希望聯系人表的每個聯系人的電子郵件必須是唯一的。那我們就可以使用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這一列中創建一個唯一的索引
現在我們向contacts表中插入一行數據來看下:
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('John','Doe','(408)-999-9765','john.doe@mysqltutorial.org');
現在我們嘗試插入一行email列中有john.doe@mysqltutorial.org, 這時我們就會得到一個報錯的信息。
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