数据库基础--完成数据完整性-约束、规则
数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,成为了数据库系统,尤其是多用户的关系数据库系统首要关注的问题。数据完整性因此而提出。本章将讲述数据完整性的概念及其在SQL Server 中的实现方法。
数据完整性(Data Integrity)是指数据的精确性(Accuracy) 和可靠性(Reliability)。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据完整 性分为四类:实体完整性(Entity Integrity)、域完整
性(Domain Integrity)、参照完整性(Referential Integrity)、用户定义的完整性(User-definedIntegrity)。
9.1.1 实体完整性(Entity Integrity)
实体完整性规定表的每一行在表中是惟一的实体。表中定义的UNIQUE PRIMARYKEY 和IDENTITY 约束就是实体完整性的体现。
9.1.2 域完整性(Domain Integrity)
域完整性是指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。
9.1.3 参照完整性(Referential Integrity)
参照完整性是指两个表的主关键字和外关键字的数 据应对应一致。它确保了有主关键字的表中对应其它表的外关键字的行存在,即保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。参 照完整性是建立在外关键字和主关键字之间或外关键字和惟一性关键字之间的关系上的。在SQL Server 中,参照完整性作用表现在如下几个方面:
禁止在从表中插入包含主表中不存在的关键字的数据行;
禁止会导致从表中的相应值孤立的主表中的外关键字值改变;
禁止删除在从表中的有对应记录的主表记录。
9.1.4 用户定义的完整性(User-defined Integrity)
不同的关系数据库系统根据其应用环境的不同,往 往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。SQL Server 提供了定义和检验这类完整性的机制,以便用统一的系统方法来处理它们,而不是用应用程序来承担这一功能。其它的完整性类型都支持用户定义的完整性。
SQL Server 提供了一些工具来帮助用户实现数据完整性,其中最主要的是:规则(Rule)、缺省值(Default)、约束(Constraint) 和触发器(Trigger)。其中约束在前面的章节中已经介绍,触发器将在后面的章节中介绍。本章将介绍规则和缺省值。
(Rule)规则 就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独 立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。规则与CHECK 约束很相似,相比之下,使用在ALTERTABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。
9.2.1 创建规则
(1) 用CREATE RULE 命令创建规则
CREATE RULE 命令用于在当前数据库中创建规则,其语法如下:
CREATE RULE rule_name AS condition_expression
其中condition_expression 子句是规则的定义。condition_expression 子句可以是能用于WHERE 条件子句中的任何表达式,它可以包含算术运算符、关系运算符和谓词(如IN、LIKE、 BETWEEN 等)。
注意:condition_expression子句中的表达式必须以字符“@”开头。
(2) 用Enterprise Manager 创建规则
在Enterprise Manager 中选择数据库对象“Rules”,单击右键从快捷菜单中选择“NewRule”选项,即会弹出如图9-1 所示的创建规则属性对话框。输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。
9.2.2 查看规则
(1) 用Enterprise Manager 查看规则
在Enterprise Manager 中选择“Rules” 对象,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间,等如图9-2 所示。在SQL Server 2000 中不像7.0 版本可以直接在任务板中看到规则的表达式,这需要查看规则的属性。可以选择要查看的规则,单击右键,从快捷菜单中选择“Properties” 选项,即会出现如图9-3 所示的对话框,可以从中编辑规则的表达式。修改规则的名称可以通过Sp_rename 系统存储过程进行,也可以直接在图9-2 中用右键单击要修改的规则,从快捷菜单中选择“重命名(Rename)” 菜单项,进行名称修改。
(2) 用存储过程Sp_helptext 查看规则
使用Sp_helptext 存储过程可以查看规则的细节,其语法如下:
sp_helptext [@objname =] 'name'
其中[@objname =] 'name'子句指明对象的名称,用Sp_helptext 存储过程查看的对象可
以是当前数据库中的规则、缺省值、触发器、视图或未加密的存储过程。
例9-5: 查看规则hire_date_rule。
exec sp_helptext hire_date_rule
运行结果如下:
Text
--------------------------------------------------------------------------------------
create rule hire_date_rule
as @hire_date >= '1980-01-01' and @hire_date <= getdate()
9.2.3 规则的绑定与松绑
创建规则后,规则仅仅只是一个存在于数据库中的 对象,并未发生作用。需要将规则与数据库表或用户自定义对象联系起来,才能达到创建规则的目的。联系的方法称为“绑定”。所谓绑定就是指定规则作用于哪个 表的哪一列或哪个用户自定义数据类型。表的一列或一个用户自定义数据类型只能与一个规则相绑定,而一个规则可以绑定多对象,这正是规则的魅力所在。解除规 则与对象的绑定称为“松绑”。
(1) 用存储过程Sp_bindrule 绑定规则
存储过程Sp_bindrule 可以绑定一个规则到表的一个列或一个用户自定义数据类型上。其语法如下:
sp_bindrule [@rulename =] 'rule',
[@objname =] 'object_name'
[, 'futureonly']
各参数说明如下:
[@rulename =] 'rule'
指定规则名称。
[@objname =] 'object_name'
指定规则绑定的对象。
'futureonly'
此选项仅在绑定规则到用户自定义数据类型上时才可以使用。当指定此选项时,仅以后使用此用户自定义数据类型的列会应用新规则,而当前已经使用此数据类型的列则不受影响。
例9-6: 绑定规则hire_date_rule 到用户自定义数据类型hire_date 上。
exec sp_bindrule hire_date_rule, hire_date
运行结果如下:
Rule bound to data type.
The new rule has been bound to column(s) of the specified user data type.
例9-7: 绑定规则hire_date_rule 到用户自定义数据类型hire_date 上,带'futureonly'选项。
exec sp_bindrule hire_date_rule, hire_date, 'futureonly'
运行结果如下:
Rule bound to data type.
例9-8: 绑定规则my_rule 到orders 表的字段order_id。
exec sp_bindrule id_rule, 'orders.[order_id]'
运行结果如下:
Rule bound to table column.
注意:规则对已经输入表中的数据不起作用。
规则所指定的数据类型必须与所绑定的对象的数据类型一致,且规则不能绑定一个数据类型为TEXT、MAGE或TIMESTAMP的列。
与表的列绑定的规则优先于与用户自定义数据类型绑定的列,因此,如果表的列的数据类型与规则A绑定,同时列又与规则B绑定,则以规则B为列的规则。
你可以直接用一个新的规则来绑定列或用户自定义数据类型,而不需要先将其原来绑定的规则解除,系统会将早班规则覆盖。
(2)用存储过程Sp_unbindrule 解除规则的绑定
存储过程Sp_unbindrule 可解除规则与列或用户自定义数据类型的绑定,其语法如下:
sp_unbindrule [@objname =] 'object_name'
[,'futureonly']
其中'futureonly'选项同绑定时一样,仅用于用户自定义数据类型,它指定现有的用此用户自定义数据类型定义的列仍然保持与此规则的绑定。如果不指定此项,所有由此用户自定义数据类型定义的列也将随之解除与此规则的绑定。
例9-9: 解除规则hire_date_rule 与用户自定义数据类型birthday 的绑定,带'futureonly'
选项。
exec sp_unbindrule birthday, 'futureonly'
运行结果如下:
(1 row(s) affected)
Rule unbound from data type.
(3) 用Enterprise Manager 管理规则的绑定
在Enterprise Manager 中,选择要进行绑定设置的规则,单击右键,从快捷菜单中选择“Properties” 选项,即会出现如图9-3 所示的规则属性对话框。图中的“Bind UDTs…”按钮用于绑定用户自定义数据类型,“Bind Columns…” 按钮用于绑定表的列。
在图9-3 中单击“Bind UDTs…” 按钮,则出现如图9-4 所示的绑定规则到用户自定义数据类型的对话框;单击“Bind Columns…” 按钮,则出现如图9-5 所示的绑定规则到表的列的对话框。
9.2.4 删除规则
可以在Enterprise Manager 中选择规则,单击右键,从快捷菜单中选择“Delete” 选项删除规则,也可使用DROP RULE 命令删除当前数据库中的一个或多个规则。其语法如下:
DROP RULE {rule_name} [,...n]
注意:在删除一个规则前,必须先将与其绑定的对象解除绑定。
例9-10: 删除多个规则
drop rule mytest1_rule,mytest2_rule
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou__zhou/archive/2007/10/11/1820052.aspx