MySQL UNIQUE Constraint

摘要:在本教程中,您将了解 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_name1column_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 UNIQUECode language: SQL (Structured Query Language) (sql)

第二个约束适用于bothaddress列:

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表中插入一行,其中的值已存在于nameaddress列中:

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 UNIQUE 约束和索引

从输出中可以看到,MySQL 在suppliers表上创建了两个UNIQUE索引: phoneuc_name_address

以下SHOW INDEX语句显示与suppliers表关联的所有索引。

SHOW INDEX FROM suppliers;Code language: SQL (Structured Query Language) (sql)
MySQL UNIQUE Constraint Example

删除唯一约束

要删除UNIQUE约束,可以使用DROP INDEXALTER 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)
MySQL 删除 UNIQUE 约束示例

添加新的唯一约束

以下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 UNIQUE Constraint Example

请注意,如果唯一约束中指定的列中的现有数据不符合唯一性规则,则MySQL不会添加唯一约束。

在本教程中,您学习了如何使用 MySQL UNIQUE约束来强制表的一列或一组列中值的唯一性。

本教程有帮助吗?