唯一性约束和唯一性索引的区别

“唯一性约束”和“唯一性索引”是不同的。
一、 建立唯一性约束的语法,使用create table或者alter table
1. 在字段级约束定义
-- 命名
create table tmp_table
(
 a int constraint pk_tmp_table_a primary key,
 b varchar(10) constraint uq_tmp_table_b unique 
)

-- 不命名
create table tmp_table
(
 a int primary key,
 b varchar(10) unique
)

2. 在表约束定义
-- 命名
create table tmp_table
(
 a int,
 b varchar(10),
 constraint pk_tmp_table_a primary key(a),
 constraint uq_tmp_table_b unique(b ASC)
)

-- 不命名
create table tmp_table
(
 a int,
 b varchar(10),
 primary key(a),
 unique(b ASC)
)

二、 建立唯一性索引的语法,使用create index

-- 必须命名
CREATE UNIQUE NONCLUSTERED INDEX xak_tmp_table_b ON tmp_table(b DESC)

--不指定[CLUSTERED | NONCLUSTERED],缺省为NONCLUSTERED(非聚集)

三、当在表中创建主键约束或者唯一性键约束时,SQL Server自动创建一个唯一性索引

这是以上脚本建立的约束:

constraint_type constraint_name constraint_keys
PRIMARY KEY (clustered) pk_tmp_table_a a
UNIQUE (non-clustered) uq_tmp_table_b b


这是索引:

index_name index_description index_keys
pk_tmp_table_a clustered, unique, primary key located on PRIMARY a
uq_tmp_table_b nonclustered, unique, unique key located on PRIMARY b
xak_tmp_table_b nonclustered, unique located on PRIMARY b(-)

可以看出,为主键和唯一性约束自动建立了同名唯一性索引。

(所以在pl/sql中一般在keys标签而不是indexs标签里建唯一约束,建了之后他会自动在indexs标签生成一个同名的索引,也可以在indexs里面建索引保证唯一性,但是他不会在keys标签生成唯一约束,建议在keys中建立唯一约束)

现在为表建立了排序顺序相反的两个索引uq_tmp_table_b和xak_tmp_table_b,不知道数据库会怎么工作?

四、题外话
表级约束中可以指定列的排序顺序(col_name ASC | DESC),但不能指定列的NULL约束;
字段级约束中可以指定列的NULL约束,但不能指定列的排序顺序;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值