《SQL_server基础教程(第二版) 教学课件 ppt 作者 董翔英第7章》由会员分享,可在线阅读,更多相关《SQL_server基础教程(第二版) 教学课件 ppt 作者 董翔英第7章(133页珍藏版)》请在金锄头文库上搜索。
1、7.1数据完整性概念 7.2缺省与规则 7.3 数据约束 7.4约束与缺省、规则比较,第七章 数据完整性,7.1数据完整性概念,1、实体完整性 实体完整性又称行完整性,确保 表中行的惟一性。实体完整性要求表 中有一个主键,其值不为空,且能够 惟一标识一行。实体完整性通过 PRIMARY KEY约束、IDENTITY约束、,UNIQUE约束和索引来实现。 如jsy表中将驾照号定义为主键,则每一个驾照号都惟一确定一个驾驶员实体,即惟一确定一条驾驶员记录。输入和修改驾照号列值时,其值不能为空,也不能重复。,域完整性又称范围完整性,确保列的取值的有效性。域完整性通过定义列的数据类型、默认值、规则和检查
2、约束来限制列值的取值范围,使输入到列的数据一定是正确的,并且是合法的。,2、域完整性,如jsy表中“是否见习”列的取值必须为“是”或“否”,不能为其他任何数据,“出生时间”列的取值不能是系统当前时间之后的时间等。 3、参照完整性 又称引用完整性,确保父表与子,表中数据的一致性。如果两个表之间数据有引用关系,则引用数据的表为子表,被引用数据的表为父表。如xc表与cl表之间,二者通过车牌号到车牌号产生引用关系,xc表为子表,cl表为父表,如表7.1和表7.2所示。,一个子表可能有多个父表,如行 车表xc中主驾、车牌号和出车单号分 别引用驾驶员表jsy、车辆表cl和车单 表cd,所以jsy表、cl表
3、和cd表均为 xc表的父表。 参照完整性通过定义外键与主键 或外键与惟一键之间的对应关系实,现。如子表xc中“车牌号”列定义为外键,并与父表cl的主键“车牌号”建立对应关系,则其取值只能是主表中已有的车牌号,确保了xc表与cl表数据的一致性。当xc表新增加一行或修改一行时,如果该行的“车牌号”列取值不存在于cl表中则出错 当删除cl表中某,一行时,如果该行的车牌号在xc中还有对应记录时,也会发出错误信息。 根据数据完整性要求,满足数据 完整性的数据一般具有以下特点: (1)数据的取值范围符合要求。 (2)数据在表中惟一标识。,(3)数据与其他表中的相关数据相匹配. 当数据由客户端传送SQLSe
4、rver服务器时,只有满足数据完整性数据才能真正地被存储到数据库中。,7.2缺省与规则,缺省和规则来源于由Sybase开 发的SQL Server,在老版本的SQL Server或者升级版本中都有缺省和规 则的使用。缺省是为列提供数据的一 种方式,如果用户进行INSERT操作 时不为列输入数据,则使用缺省值。,规则是当用户进行INSERT或PDATE 操作时,对输入列中的数据设定的取 值范围。缺省与规则有以下特点: (1)缺省与规则是数据库对象,它们是 独立于表和列而建立的。 (2)缺省与规则建立后与列或数据类型 产生关联,列和数据类型就具有了缺,省与规则的属性。 (3)缺省与规则定义后,可以
5、重复使 用,可以绑定到多个列或数据类型 上。 (4)缺省与规则不随表同时调入内存, 当用到时才被调入内存,这可能会使 程序执行出现延时。,缺省与规则不是ANSI标准,一般不提倡使用,应尽可能使用约束,任何可以使用缺省与规则的地方都有可以使用约束。缺省和规则对象通常只在它所创建的数据库中有效,可以用脚本创建缺省和规则,并复制到其它数据库。,7.2.1 创建缺省和规则,(一)命令方式 可以使用CREATE DEFAULT和 CREATE RULE命令分别创建缺省和 规则,命令格式分别为: CREATE DEFAULTdefault_name,AS constant_expression CREAT
6、E RULE rulet_name AS rule_conditions 其中default_name和rule_name 分别为缺省值对象名和规则对象名, constant_expression为一个常量、,数学表达式或内置函数,不能引用其列或别的数据库对象。 rule_conditions为规则表达式,表示数据需满足的条件。,例7.1创建缺省对象,默认为字符型数据“是”,以便将来绑定到是否见习列,使是否见习列的取值默认为“是”。,CREATE DEFAULT def_jx AS “是”,例7.2创建规则对象,规定取值可以为“队长”或“副队长”或“调度员”。以便将来绑定到职称列,使职务列的取
7、值只能为其之一。,CREATE RULE rul_zw AS zw IN (队长,副队长,调度员) 其中zw为占位符,当规则绑定到一个列时,列的名字被占位符替代。这样可以在不知道列名的情况下建立规则。,例7.3创建缺省对象,默认为字符型数据“天津”,以便将来绑定到籍贯列,使籍贯列的取值默认为“天津”。 在SQL Server Management Studio查询窗口中运行以下代码:,USE traffic1 GO CREATE DEFAULT mr_籍贯 AS 天津 GO 执行结果如图7.1所示,在窗口左边可看到新创建的表mr_籍贯。,7.2.2 绑定,在定义了缺省和规则之后,下一步就是将它
8、们绑定到相应的列中,或绑定到用户自定义的数据类型上,以便它们在数据输入或修改操作中起作用。,使用时要注意缺省和规则所用的数据类型必须与将要绑定的列数据类型一致,还要遵循已应用到该列中的约束。,通过调用系统过程 SP_BINDEFAULT和SP_BINDRULE,可以为一个列或用户自定义数据类型绑定一个缺省和规则,其语法格式分别为:,SP_BINDEFAULTdefault_name, object_name ,FUTUREONLY SP_BINDRULE rule_name, object_name ,FUTUREONLY 其中参数说明:,1)default_name和rule_name分别为
9、缺省名和规则名。 2)object_name为对象名,如果 object_name为“表名列名”形式, 则认为object_name是列名,否则认 为是自定义数据类型对象名。 3)FUTUREONLY表示缺省和规则仅,对在此之后创建的相同自定义数据类型的列有效。 例7.4将规则rul_zc绑定到“职称列”。 EXEC SP_BINDRULE rul_zc , ddy.职务,例7.5将缺省def_jx绑定到“是否见习”列。 EXEC SP_BINDEFAULT def_jx, jsy.是否见习 执行结果如图7.2所示,在表dbo.jsy中可看到缺省def_jx与“是否见习”列已绑定,如图7.3所
10、示。,7.2.3取消绑定,当不再需要缺省或规则时,可以取消绑定,使列的取值恢复原来的状态。在SQL Server Management Studio查询窗口中可以使用命令操作方式取消绑定。,可调用系统过程SU_UNBIDNEFAULT或SP_UNBINDRULE取消绑定,其 语法格式为: SU_UNBINDEFAULT,object_name , FUTUREONLY SP_UNBINDRULE object_name ,FUTUREONLY 其中参数说明: 1)object_name为对象名,如果,object_name为“表名列名”形 式,则认为object_name是列名, 否则认为是自
11、定义数据类型对象 名。当你取消用户自定义数据类型 的绑定时,所有属于该数据类型的 列同时取消绑定。对属于该数据类,型的列,如果其缺省和规则直接绑定到列上,则该列不受影响。 2)FUTUREONLY仅用于取消此后的用户自定义数据类型的绑定,缺省和规则对现有的属于该数据类型的列仍有效。,例7.6取消是否见习列的缺省def_jx绑定。 EXEC SP_UNBINDEFAULT , jsy. 是否见习 例7.7取消职称列的规 则rul_zw绑定,其语句代码为:,在这里不需要提供缺省名称或规则名称,因为无论缺省或规则是否绑定在对象上,每一个列或用户自定数据类型只能与一个缺省或规则建立关联。,EXEC S
12、P_UNBINDRULE ddy.职务,7.2.4删除缺省和规则,当缺省和规则对象不再需要时可以删除,在删除缺省或规则之前,必须确认解除了被绑定对象和要删除的缺省或规则之间的绑定关系。在SQL Server Management Studio查询窗口中使用命令操作方式或在对象资源,管理器中用界面操作方式删除缺省和规则对象。使用DROP DEFAULT或 DROP RULE命令删除缺省和规则,其命令格式分别为: DROP DEFAULT default_name,n DROP RULE rule_name,n,其中default_name和rule_name 分别为要删除的缺省名和规则名, 可以
13、包含所有者名。参数n表示可以同 时指定多个缺省或规则一次删除。 例7.8删除缺省对象def_jx 语句为: DROP DEFAULT def_jx,例7.9删除规则对象rul_zw的语句为:DROP RULE rul_zw 也可以打开对象资源管理器,展开层次结构,选择并展开数据库的规则对象或默认值对象,在需要删除的规则对象或默认值对象上单击鼠标右键,在快捷菜单中选择“删除”,如图7.4所示。,7.3数据约束,约束是指在数据进入到数据库之前应满足的要求或限定的条件。约束不是一个独立的对象,而是数据表的一部分。在创建表时,可以对某一列或多个列的组合设置限制条件,让SQL Server帮助检查,该列
14、的输入值是否符合要求。当用 户从客户端传送数据到SQLServer服务器,系统也会检查数据是否符合要求,如果不符合要求将拒绝接受。 可以对表设置主键(PRIMARY KEY)约束、惟一(UNIQUE)约束、外键,(FOREIGN KEY)约束、缺省 (DEFAULT)约束和检查 (CHECK)约束等,对于BYTE和 TEXT列不可以指定主键约束、惟一 约束和外键约束,但可以用检查约束来检查其值是否为NULL。,约束作为表的一部分,可以在创建表的同时创建约束,也可以在建立表之后追加定义或删除定义。在一个表中可以定义多个约束,甚至可以在一个列上定义多个约束。,7.3.1列级约束与表级约束,列级约束
15、是定义在一个列上的约束,是列定义的一部分,与列名、数据类型、惟一标识号、默认值和排序规则等一样,都是列的属性。严格地说列的数据类型也是一种列约束,它限定了列的取值的域。,表级约束是在列定义外单独定义的,它是多列之间的约束,用 CONSTRAINT关键字定义。如果 要对一个表中的多个列定义约束, 必须首先定义每个列,然后在末尾 追加表约束。,例7.10创建含有列约束驾驶员 表jsy_temp1 CREATE TABLE jsy_temp1 ( 驾照号 char(8) NOT NULL, 姓名 varchar(8) NOT NULL, 是否见习 char(1) NOT NULL , 所学专业 va
16、rchar(8) NULL),其中NOT NULL为每个列定义中列级约束,为简单起见,都没有定义 列约束名,由系统自动命名。 例7.11创建含有表约束的行车 表xc_temp。,CREATE TABLE xc_temp ( 驾照号 char(6) NOT NULL, 车牌号 char(4) NOT NULL, 调度号 char(4) NULL, 行程 smallint NULL, CONSTRAINT pkey_xc_temp PRIMARY KEY (驾照号, 车牌号)),其中表级约束是一个主键约束, 约束名为pkey_xc_temp,主键为 “驾照号”和“车牌号”两列的组合。作为主键的列不能为NULL,无论是否定义为NOT NULL,如果列被定义,为主键或主键的一部分,列自然变为NOT NULL属性。 可以为每个约束设定约束名,也可以不设定,如果不命名约束,系统将自动提供一个不重复的名字。如:DF_Szexam