0%

13.2.5 数据库约束 2.unique约束

13.2.5 数据库约束 2.UNIQUE约束

唯一约束用于保证指定列或指定列组合不允许出现重复值。虽然唯一约束的列不可以出现重复值,但可以出现多个null值(因为在数据库中null不等于null
同一个表内可建多个唯一约束,唯一约束也可由多列组合而成。当为某列创建唯一约束时,MySQL会为该列相应地创建唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同。
唯一约束既可以使用列级约束语法建立,也可以使用表级约束语法建立。
如果需要为多列建组合约束,或者需要为唯一约束指定约束名,则只能用表级约束语法
当建立唯一约束时,MySQL在唯一约束所在列或列组合上建立对应的唯一索引。

使用列级约束语法建立唯一约束

使用列级约束语法建立唯一约束非常简单,只要简单地在列定义后增加unique关键字即可SQL语句如下:

1
2
3
4
5
create table unique_test
(
test_id int not null,
test_name varchar(255) unique
);

表级约束语法建立唯一约束

如果需要为多列组合建立唯一约束,或者想自行指定约束名,则需要使用表级约束语法。表级约束语法格式如下:

1
[constraint 约束名] 约束定义

上面的表级约束语法格式既可放在create table语句中与列定义并列,也可放在alter table语句中使用add关键字来添加约束。SQL语句如下:

1
2
3
4
5
6
7
8
9
10
create table unique_test2
(
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
# 使用表级约束语句建立唯一约束
unique (test_name),
# 使用表级约束语法建立唯一约束,而且指定约束名
constraint test_2uk unique(test_pass)
)

上面的建表语句为test_nametest_pass分别建立了唯一约束,这意味着这两列都不能出现重复值。除此之外,还可以为这两列组合建立唯一约束,SQL语句如下:

1
2
3
4
5
6
7
create table unique_test3
(
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
constranint test3_uk unique(test_name,test_pass)
);

对于上面的unique_test2unique_test3两个表,都是对test_nametest_pass建立唯一约束,其中unique_test2要求test_nametest_pass都不能出现重复值,而unique_test3只要求test_nametest_pass两列值的组合不能重复。

修改表结构时增加或删除唯一约束

也可以在修改表结构时使用add关键字来增加唯一约束,SQL语句如下:

1
2
alter table unique_test3
add unique(test_name,test_pass)

还可以在修改表时使用modify关键字,为单列采用列级约束语法来增加唯一约束,代码如下:

1
2
alter table unique_test3
modify test_name varchar(255) unique;

对于大部分数据库而言,删除约束都是在alter table语句后使用“drop constraint约束名”语法来完成的,但MySQL并不使用这种方式,而是使用“drop index 约束名”的方式来删除约束。例如如下SQL语句:

1
2
alter table unique_test3
drop index test3_uk;

原文链接: 13.2.5 数据库约束 2.unique约束