索引(四)使用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就能夠看到mysqlemail這一列中創建一個唯一的索引

現在我們向contacts表中插入一行數據來看下

INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('John','Doe','(408)-999-9765','[email protected]');

現在我們嘗試插入一行email列中有[email protected], 這時我們就會得到一個報錯的信息。

INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Johny','Doe','(408)-999-4321','[email protected]');

報錯如下:

Error Code: 1062. Duplicate entry '[email protected]' for key 'unique_email'

假設我們要一個first_namelast_namephone的聯合索引,我們可以使用下面的語法來得到

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','[email protected]');

報錯如下:

Error Code: 1062. Duplicate entry 'john-doe-(408)-999-9765' for key 'idx_name_phone'

總結下,在這篇文章中,我們學習到如何使用mysql unique index去避免數據庫中的重複值了。建議同學們下面能夠親自去實踐下

翻譯參考:
Using MySQL UNIQUE Index To Prevent Duplicates

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章