摘要:在本教程中,您将了解 MySQL UNIQUE
约束以及如何使用UNIQUE
约束来强制表中的一列或一组列中的值的唯一性。
MySQL UNIQUE
约束简介
有时,您希望确保一列或一组列中的值是唯一的。例如, users
表中用户的电子邮件地址或customers
表中客户的电话号码应该是唯一的。要强制执行此规则,请使用UNIQUE
约束。
UNIQUE
约束是一种完整性约束,可确保一列或一组列中的值是唯一的。 UNIQUE
约束可以是列约束或表约束。
要在创建表时为列定义UNIQUE
约束,请使用以下语法:
CREATE TABLE table_name(
...,
column_name data_type UNIQUE,
...
);
Code language: SQL (Structured Query Language) (sql)
在此语法中,您可以在要强制执行唯一性规则的列的定义中包含UNIQUE
关键字。如果插入或更新导致column_name
重复的值,MySQL将拒绝更改并发出错误。
此UNIQUE
约束是列约束。您可以使用它来强制执行一列的唯一规则。
要为两个或更多列定义UNIQUE
约束,请使用以下语法:
CREATE TABLE table_name(
...
column_name1 column_definition,
column_name2 column_definition,
...,
UNIQUE(column_name1,column_name2)
);
Code language: SQL (Structured Query Language) (sql)
在此语法中,您可以在UNIQUE
关键字后面的括号中添加以逗号分隔的列列表。 MySQL 使用列column_name1
和column_name2
中的值的组合来评估唯一性。
如果定义UNIQUE
约束时未指定名称,MySQL 会自动为其生成名称。要定义带有名称的UNIQUE
约束,请使用以下语法:
[CONSTRAINT constraint_name]
UNIQUE(column_list)
Code language: SQL (Structured Query Language) (sql)
在此语法中,您可以在CONSTRAINT
关键字之后指定UNIQUE
约束的名称。
MySQL UNIQUE
约束示例
首先,创建一个名为suppliers
新表,并具有两个UNIQUE
约束:
CREATE TABLE suppliers (
supplier_id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
phone VARCHAR(15) NOT NULL UNIQUE,
address VARCHAR(255) NOT NULL,
PRIMARY KEY (supplier_id),
CONSTRAINT uc_name_address UNIQUE (name , address)
);
Code language: SQL (Structured Query Language) (sql)
在此示例中,为phone
列定义了第一个UNIQUE
约束:
phone VARCHAR(12) NOT NULL UNIQUE
Code language: SQL (Structured Query Language) (sql)
第二个约束适用于both
和address
列:
CONSTRAINT uc_name_address UNIQUE (name , address)
Code language: SQL (Structured Query Language) (sql)
其次,在suppliers
表中插入一行。
INSERT INTO suppliers(name, phone, address)
VALUES( 'ABC Inc',
'(408)-908-2476',
'4000 North 1st Street');
Code language: SQL (Structured Query Language) (sql)
第三,尝试插入不同的供应商,但其电话号码已存在于suppliers
表中。
INSERT INTO suppliers(name, phone, address)
VALUES( 'XYZ Corporation','(408)-908-2476','3000 North 1st Street');
Code language: SQL (Structured Query Language) (sql)
MySQL 发出错误:
Error Code: 1062. Duplicate entry '(408)-908-2476' for key 'phone'
Code language: JavaScript (javascript)
第四,将电话号码更改为其他号码并再次执行插入语句。
INSERT INTO suppliers(name, phone, address)
VALUES( 'XYZ Corporation','(408)-908-3333','3000 North 1st Street');
Code language: SQL (Structured Query Language) (sql)
第五,在suppliers
表中插入一行,其中的值已存在于name
和address
列中:
INSERT INTO suppliers(name, phone, address)
VALUES( 'ABC Inc',
'(408)-908-1111',
'4000 North 1st Street');
Code language: SQL (Structured Query Language) (sql)
MySQL 发出错误,因为违反了UNIQUE
约束uc_name_address
。
Error Code: 1062. Duplicate entry 'ABC Inc-4000 North 1st Street' for key 'uc_name_address'
Code language: JavaScript (javascript)
MySQL UNIQUE
约束和索引
当您定义唯一约束时,MySQL 会创建相应的UNIQUE
索引并使用该索引来强制执行该规则。
SHOW CREATE TABLE
语句显示了suppliers
表的定义:
SHOW CREATE TABLE suppliers;
Code language: SQL (Structured Query Language) (sql)

从输出中可以看到,MySQL 在suppliers
表上创建了两个UNIQUE
索引: phone
和uc_name_address
。
以下SHOW INDEX
语句显示与suppliers
表关联的所有索引。
SHOW INDEX FROM suppliers;
Code language: SQL (Structured Query Language) (sql)

删除唯一约束
要删除UNIQUE
约束,可以使用DROP INDEX
或ALTER TABLE
语句:
DROP INDEX index_name ON table_name;
Code language: SQL (Structured Query Language) (sql)
ALTER TABLE table_name
DROP INDEX index_name;
Code language: SQL (Structured Query Language) (sql)
例如,以下语句删除suppliers
表上的uc_name_address
约束:
DROP INDEX uc_name_address ON suppliers;
Code language: SQL (Structured Query Language) (sql)
再次执行SHOW INDEX
语句以验证uc_name_unique
约束是否已删除。
SHOW INDEX FROM suppliers;
Code language: SQL (Structured Query Language) (sql)

添加新的唯一约束
以下ALTER TABLE ADD CONSTRAINT
将唯一约束添加到现有表的列:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE (column_list);
Code language: SQL (Structured Query Language) (sql)
此语句将UNIQUE
约束uc_name_address
添加回suppliers
表:
ALTER TABLE suppliers
ADD CONSTRAINT uc_name_address
UNIQUE (name,address);
Code language: SQL (Structured Query Language) (sql)

请注意,如果唯一约束中指定的列中的现有数据不符合唯一性规则,则MySQL不会添加唯一约束。
在本教程中,您学习了如何使用 MySQL UNIQUE
约束来强制表的一列或一组列中值的唯一性。