唯一限制性关键字只是表单中候补关键字的别称。候补关键字可以是表单中没有被指定为主关键字的任何一列,只要它的值对于这个表来说是唯一的就行了。换言之,在唯一的一列里不会出现相同的值。例如,你可以选择车辆编号(VIN)作为表Automobile(机动车)的候补关键字,而表的主关键字是机动车车牌号(Automobile Identification),它是由系统生成的ID号。然后你可以在Automobile表的VIN列上加上唯一性限制并创建另一个拥有VIN列的表。你可以在第二个表中申明一个外关键字指向Automobile表。数据库会强制任何输入的VIN必须已经在Automobile表中存在。这是在数据库中确保数据集成性的另一种方法。
create table parent
(parent_idint not null, -- 主关键字
parent_alternate_keyint not null, -- 修补关键字
parent_col1int null,
parent_col2int null,
constraintpk_parent_id primary key (parent_id),
constraintak_parent_alternate_key
unique (parent_id, parent_alternate_key)
)
go
insert parent values ( 1, 10, 150, 151)
insert parent values ( 2, 11, 122, 271)
insert parent values ( 3, 12, 192, 513)
insert parent values ( 4, 13, 112, 892)
go
create table child2
(child2_parent_id int not null, -- 主关键字/外关键字
child2_id int not null, -- 主关键字
child2_col1int null,
child2_parent_alternate_key int not null, -- 外关键字
constraint pk_child2 primary key
(child2_parent_id, child2_id),
constraint fk_child2_parent foreign key (child2_parent_id)
referencesdbo.parent(parent_id),
constraint fk_pk_ak_child2_parent foreign key
(child2_parent_id,child2_parent_alternate_key)
referencesdbo.parent(parent_id,
parent_alternate_key)
)
go
insert child2 values (1,1,34,10)
insert child2 values (4,2,34,13)
insert child2 values (2,3,34,11)
go
insert child2 values (1,4,34,23) -- 这个命令会失败