6.2.3 SQL Server完整性控制机制
上面介绍了关系数据库完整性控制的一般方法,下面介绍SQL Server的完整性控制策略。
1)SQL Server中的实体完整性
SQL Server在CREATE TABLE语句中提供了PRIMARY KEY子句来实现主键的声明。可以在CREATE TABLE或ALTER TABLE语句中使用PRIMARY KEY子句,实现主键约束的创建、删除或修改。一个表中只能有一个主键,即只能设置一个主键约束对象。
2)SQL Server中的参照完整性
SQL Server的参照完整性约束可以在CREATE TABLE或ALTER TABLE语句中使用FOREIGN KEY和REFERENCES子句创建。SQL Server中的参照完整性有两种规则:更新规则(ON UPDATE)和删除规则(ON DELETE),两种规则又共用4种模式:不执行任何操作(NO ACTTON)、级联(CASCADE)、置空(SET NULL)和设置默认值(SET DEFAULT)。
(1)不执行任何操作
这是默认值,当没有对两种规则指定模式时,就会默认模式为NO ACTTON。在该模式下,要求外键列(参照列)不能插入或修改成主键列(被参照列)没有的值(删除不受影响);主键表不能修改涉及外部键值记录的主键值,不能删除涉及外部键值的记录(插入不受影响)。
(2)级联
这种模式要求外键列不能插入或修改成主键列没有的值(删除不受影响),且随着主键值的修改,相应的外部键值同步修改,随着主键表行的删除,相应的外键表行也同步删除(主键表插入不受影响)。
(3)置空
该模式要求,外键列不能插入或修改成主键列没有的值(但删除不影响),且随着主键值的修改或删除(行),相应的外部键值置空(主键表插入不影响)。
(4)设置默认值
该模式要求,外键列不能插入或修改成主键列没有的值(但删除不影响),且随着主键值的修改或删除(行),相应的外部键值被设置成默认值(主键表插入不影响)。
值得注意的是,如果没有对外键列设置默认约束,则默认值为NULL,如果设置了默认值约束,则该默认值必须是被参照列中的某一个数据项,否则在插入默认值时会失败(外键列不能插入或修改成主键列没有的值)。
【例6.8】 分析下列程序的结果。
在上例中,表Student中字段Cno为外键,将其UPDATE和DELETE设置为空值“SET NULL”模式。在这种设置下,如果Course表中主键值的修改或删除,则相应的Student表中的外部键值Cno置空值。
3)SQL Server中的用户自定义完整性
用户自定义的完整性一般是针对列的限制,比如:要求某一列的值不能为空,某一列的值在表中要是唯一的,或者要在某个取值范围之内等。有的教材也称之为“域完整性”。SQL Server运行用户定义下列完整性约束:列值非空(NOT NULL约束)、列值唯一(UNIQUE约束)和检查列值是否满足一个布尔表达式(CHECK约束)。