唯一性約束和唯一性索引的區別

kitesky發表於2005-04-19

“唯一性約束”和“唯一性索引”是不同的。
一、 建立唯一性約束的語法,使用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_typeconstraint_nameconstraint_keys
PRIMARY KEY (clustered)pk_tmp_table_aa
UNIQUE (non-clustered)uq_tmp_table_bb


這是索引:

index_nameindex_descriptionindex_keys
pk_tmp_table_aclustered, unique, primary key located on PRIMARYa
uq_tmp_table_bnonclustered, unique, unique key located on PRIMARYb
xak_tmp_table_bnonclustered, unique located on PRIMARYb(-)

可以看出,為主鍵和唯一性約束自動建立了同名唯一性索引。
現在為表建立了排序順序相反的兩個索引uq_tmp_table_b和xak_tmp_table_b,不知道資料庫會怎麼工作?

四、題外話
表級約束中可以指定列的排序順序(col_name ASC | DESC),但不能指定列的NULL約束;
欄位級約束中可以指定列的NULL約束,但不能指定列的排序順序;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-796420/,如需轉載,請註明出處,否則將追究法律責任。

相關文章