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

如题所述

第1个回答  2016-08-18

“唯一性约束”和“唯一性索引”是不同的。

一、 建立唯一性约束的语法,使用create table或者alter table

1. 在字段级约束定义

2. 在表约束定义

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


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

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

     


       这是索引:


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

四、题外话

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

第2个回答  2016-08-09
  “唯一性约束”和“唯一性索引”是不同的。
  一、 建立唯一性约束的语法,使用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(-)

  可以看出,为主键和唯一性约束自动建立了同名唯一性索引。如果现在为表建立了排序顺序相反的两个索引uq_tmp_table_b和xak_tmp_table_b,不知道数据库会怎么工作?

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