第三讲 规则和默认值约束
2.6 规则 2.6.1 规则的定义 规则就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。规则与CHECK 约束很相似,相比之下,使用在ALTERTABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。
2.6.2 规则的语法结构 CREATE RULE创建称为规则的对象。当绑定到列或用户自定义数据类型时,规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能,执行一些与CHECK约束相同的功能。CHECK 约束是使用 ALTER 或 CREATE TABLE 的 CHECK 关键字创建的,是对列中的值进行限制的首选标准方法(可以对一列或多列定义多个约束)。列或用户自定义数据类型只能有一个绑定的规则。但是,列可以同时具有一个或多个与其关联的检查约束。在这种情况下,将检查所有限制。
语法 CREATE RULE rulename AS condition_expression 参数 rulename是新规则的名称。规则名称必须符合标识符规则。可以选择是否指定规则所有者的名称。 condition_expression是定义规则的条件。规则可以是 WHERE 子句中任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如 IN、LIKE、BETWEEN)之类的元素。规则不能引用列或其它数据库对象。可以包含不引用数据库对象的内置函数。 condition_expression 包含一个变量。每个局部变量的前面都有一个 @ 符号。该表达式引用通过 UPDATE 或 INSERT 语句输入的值。在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是 @ 符号。
示例 A. 范围规则 例题2-5 下例创建一个规则,用以限制插入该规则所绑定的列中的整数范围。 CREATE RULE range_rule AS @库存量 >= 0
B. 列表规则 例题2-6 下例创建一个规则,用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。 CREATE RULE list_rule AS @商品类型 IN (‘台式机’, ‘笔记本’, ‘平板电脑‘,’耗材’)
C. 模式规则 例题2-7 创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符和任意多个字符(或没有字符),并以 0 到 9 之间的整数结尾。 CREATE RULE pattern_rule AS @value LIKE '_ _-%[0-9]'
1) 用存储过程Sp_bindrule 绑定规则 存储过程Sp_bindrule 可以绑定一个规则到表的一个列或一个用户自定义数据类型上。其语法如下: sp_bindrule [@rulename =] 'rule', [@objname =] 'object_name' [, 'futureonly'] 各参数说明如下: [@rulename =] 'rule' 指定规则名称。 [@objname =] 'object_name' 指定规则绑定的对象。 'futureonly' 此选项仅在绑定规则到用户自定义数据类型上时才可以使用。当指定此选项时,仅以后使用此用户自定义数据类型的列会应用新规则,而当前已经使用此数据类型的列则不受影响。
注意:规则对已经输入表中的数据不起作用。 规则所指定的数据类型必须与所绑定的对象的数据类型一致,且规则不能绑定一个数据类型为TEXT、MAGE或TIMESTAMP的列。 与表的列绑定的规则优先于与用户自定义数据类型绑定的列,因此,如果表的列的数据类型与规则A绑定,同时列又与规则B绑定,则以规则B为列的规则。 你可以直接用一个新的规则来绑定列或用户自定义数据类型,而不需要先将其原来绑定的规则解除,系统会将早班规则覆盖。
(2)用存储过程Sp_unbindrule 解除规则的绑定 存储过程Sp_unbindrule 可解除规则与列或用户自定义数据类型的绑定,其语法如下: sp_unbindrule [@objname =] 'object_name' [,'futureonly'] 其中'futureonly'选项同绑定时一样,仅用于用户自定义数据类型,它指定现有的用此用户自定义数据类型定义的列仍然保持与此规则的绑定。如果不指定此项,所有由此用户自定义数据类型定义的列也将随之解除与此规则的绑定。
CREATE RULE 定义一个适用于特定表或者视图的新规则。 CREATE OR REPLACE RULE 要么是创建一个新规则, 要么是用一个同表上的同名规则替换现有规则。 现在一般情况下不采用规则的方式来对属性列进行约束,而是会采用约束的方式来完成对属性列的约束。
2.6.3 默认值约束 默认值(Default)是数据库对象之一,它指定在数据库中的表插入数据时,如果用户没有明确给出某个字段的值,SQL Server会自动指定该字段值使用默认值。 记录中的每一列均必须有值,即使它是 NULL。可能会有这种情况,当向表中装载新行时可能不知道某一列的值,或该值尚不存在。如果该列允许空值,就可以将该行赋予空值。由于有时不希望有可为空的列,因此如果合适,更好的解决办法可能是为该列定义 DEFAULT 定义。例如,通常将数字型列的默认值指定为零,将字符串列的默认值指定为暂缺。
当将某行装载到为行定义了 DEFAULT 的表中时,若没有指定列值,则是隐性要求 Microsoft SQL Server 2005 将默认值装载到该列中。 说明 也可以使用 INSERT STATEMENT 语句 DEFAULT VALUES 子句显式要求 SQL Server 将默认值插入列中。 如果列不允许空值且没有 DEFAULT 定义,就必须明确地指定列值,否则 SQL Server 会返回错误信息,指出该列不允许空值。
将 DEFAULT 定义、为空性和对列值的插入归纳如下: 列定义 无输入, 无 DEFAULT 定义 DEFAULT 定义 输入空值 允许空值 NULL 默认值 不允许空值 错误
DEFAULT 对象是为特定数据库定义的。通过将其绑定到默认值要应用的每个列上,它可为不同表的列所共享。例如,如果多个表中均有 quantity 列,则可以在数据库中定义 DEFAULT 对象,当用户在任何表的 quantity列中未输入值时在该列中插入数值 1。
如果 DEFAULT 对象绑定到某列上,可在特定的表中为该列指定不同的默认值。这样在向列绑定新的默认值之前从该列中释放已有的 DEFAULT 对象。 格式: DEFAULT 默认值 例题2-8 定义库存数量的默认值为20。 库存数量 int DEFAULT 20