使用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