“唯一性約束”和“唯一性索引”是不同的。
一、 建立唯一性約束的語法,使用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約束,但不能指定列的排序順序;