mysql使用惟一索引避免插入重複數據

使用MySQL 索引防止一個表中的一列或者多列產生重複值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

二: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這一列中建立一個惟一的索引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

相關文章
相關標籤/搜索