摘要:這篇文章中,我們會一起聊下如何使用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','[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_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','[email protected]');
報錯如下:
Error Code: 1062. Duplicate entry 'john-doe-(408)-999-9765' for key 'idx_name_phone'
總結下,在這篇文章中,我們學習到如何使用mysql unique index去避免數據庫中的重複值了。建議同學們下面能夠親自去實踐下