主题:  SQL Server 2000基础:数据完整性(1)

星空骑兵

职务:普通成员
等级:1
金币:0.0
发贴:6
注册:2002/10/24 13:24:20
#12002/10/24 16:46:02
级联引用完整性约束

  在关系数据库中使用主-外键的指向来表示表间的关系,当用户试图删除或更新外键所指向的键时,级联引用完整性约束使你得以定义SQL Server 2000所采取的操作。下面我们以企业管理器中的关系图来说明,图中包括三个表:table1(主键tab1_ID)、table2(主键tab2_ID)、table3(主键tab3_ID):


我们先看table1和table2之间的关系设置:


A:指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。

B:指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。

  我们按照图中设置FK_table2_table1 约束,该约束建立了从 table2 表中的 tab1_ID 列到 table1 表中的 tab1_ID 主键列的外键关系。如果删除 tab1_ID = 1 的 table1 表中的行时也将删除 tab1_ID = 1 的 table2 表中的行。如果更新 table1表中的tab1_ID=1 值为2也将更新 table2 表中 tab1_ID 值当前等于1的行的 tab1_ID 值为2。

  删除和更新语句可启动一系列级联引用操作。如关系图中建立FK_table3_table2约束,设置与FK_table2_table1约束相同,然后也要建立FK_table3_table1约束,设置如下图:


  对于FK_table3_table1不必启用级联引用,在删除或更新所产生的所有级联引用操作的列表中,每个表只能出现一次。级联引用操作树到任何给定表的路径必须只有一个,否则将导致循环或多重级联路径而出错。

  如果删除 table1 中的行,则该操作也将删除 table2 中具有与 table1 中所删除的主键匹配的任何外键中的所有行,然后删除 Table3 中具有与 Table2 中所删除的主键匹配的任何外键中的所有行。如果是更新的话也会产生级联更新的效果。系统将自动维护数据的完整。

  我们使用级联引用比较典型的应用是论坛系统,假如有一个用户表、一个话题表、一个回复表,我们参照关系图建立关系,启用了级联引用后,如果有一个用户发贴、回贴后,他又想改名,那么他改了名以后,数据库将自动帮他修改保存在话题表、回复表里的用户名。

编辑历史:[这消息被星空骑兵编辑过(编辑时间2002-10-28 14:58:04)]


cjwdg

职务:普通成员
等级:1
金币:0.0
发贴:23
注册:2001/10/29 17:19:36
#22002/10/28 15:02:27
嗯,看懂了