mysql使用唯一索引避免插入重復數據


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM