一、数据库完整性概述
  1.数据库的完整性:
  ①数据库的完整性是指数据的正确性和相容性
  ②数据库完整性是防止不合语义或不正确的数据进入数据库
  ③完整性体现了是否真实地反映现实世界
  例:
  学生的年龄必须是整数,取值范围为14-29;
  学生的性别只能是男或女;
  学生的学号一定是的;
  学生所在的系必须是学校开设的系;
  2.DBMS维护数据库完整性的机制:
  ①提供定义完整性约束条件的机制
  DBMS应提供定义数据库完整性约束条件,并把它们存入数据库中。
  ②提供完整性检查的方法
  检查数据是否满足完整性约束条件的机制称为完整性检查。一般在INSERT、UPDATE、DELETE语句执行后开始检查。
  3.违约处理
  DBMS若发现用户的操作违背了完整性约束条件,采取一定的动作以保证数据的完整性,如拒绝执行该操作,或级联执行其他操作。

  二、缺省(默认值)和规则
  缺省和规则来源于由Sybase开发的S默认值QLServer,在老版本的SQLServer或者升级版本中都有缺省和规则的使用。
  缺省是为列提供数据的一种方式,如果用户进行INSERT操作时不为列输入数据,则使用缺省值。
  规则是当用户进行INSERT或uPDATE操作时,对输入列中的数据设定的取值范围,是实现域完整性的方式之一。
  缺省与规则有以下特点:
  (1)缺省与规则是数据库对象,它们是独立于表和列而建立的。
  (2)缺省与规则建立后与列或数据类型产生关联,列和数据类型具有了缺省与规则的属性。
  (3)缺省与规则定义后,可以重复使用,可以绑定到多个列或数据类型上。
  (4)缺省与规则不随表同时调入内存,当用到时才被调入内存,这可能会使程序执行出现延时。
  缺省和规则对象通常只在它所创建的数据库中有效,不是ANSI标准,一般不提倡使用。
  应尽可能使用约束,任何可以使用缺省与规则的地方都有可以使用约束。
  1.缺省
  在SQLServer中,有两种使用默认值的方法:
  ①在创建表时,指定默认值。
  用SQLServerManagementStudio创建表时在设计表时指定默认值,可以在输入字段名称后,设定该字段的默认值。
  或使用CREATETABLE语句中的DEFAULT子句指定默认值。
  ②使用CREATEDEFAULT语句创建默认对象后,使用存储过程sp_bindefault将该默认对象绑定到列上。
  默认值对象是单独存储的,删除表的时候,DEFAULT约束会自动删除,但是默认值对象不会被删除。
  创建默认值对象后,需要将其绑定到某列或者用户自定义的数据类型上。
  主要操作:
  ①创建默认值对象
  ②绑定默认值对象
  ③解除默认值对象的绑定
  ④查看默认值对象
  ⑤删除默认值对象
  ①创建默认对象
  可以使用CREATEDEFAULT语句创建默认对象。其语法格式如下:
  CREATEDEFAULTdefaultASconstant_expression
  例如:createdefaultd_gradeas1
  ②绑定默认对象
  默认对象创建后不能使用,必须首先将其绑定到某列或者用户自定义的数据类型上。其使用语法格式如下:
  sp_bindefault[@defname=]'default',[@objname=]'object_name'[,[@futureonly=]'futureonly_flag']
  其中:[,[@futureonly=]‘futureonly_flag’]仅在此之后将默认值绑定到用户定义的数据类型时才使用。
  例如:execsp_bindefault'd_grade',‘sc.grade'
  ③解除默认对象的绑定
  解除绑定可以使用sp_unbindefault存储过程。其语法格式如下:
  sp_unbindefault[@objname=]'object_name'
  例如:execsp_unbindefault‘sc.grade'
  ④查看默认对象
  execsp_helpd_grade
  execsp_helptextd_grade
  ⑤删除默认对象
  在删除默认对象之前,首先要确认默认对象已经解除绑定。删除默认对象使用DROPDEFAULT语句。其语法格式如下:
  DROPDEFAULT{default}[,…n]
  例如:dropdefaultd_grade
  2.规则
  规则用以限制存储在表中或用户自定义数据类型的值,是独立的数据库对象。
  将规则绑定到列或用户自定义数据类型时,规则才起作用。
  表中的每列或每个用户定义数据类型只能和一个规则绑定。但每列可应用多个CHECK约束。
  如果要删除规则,应确定规则已经解除绑定。
  ①创建规则
  CREATERULE语句,其语法格式如下:
  CREATERULErulenameAScondition_expression
  其中各参数含义如下:
  rulename是新规则的名称。
  condition_expression是定义规则的条件。
  例如:createruler_gradeas@grade<=100and@grade>=0
  ②绑定规则
  使用sp_bindrule存储过程,语法格式为:
  sp_bindrule[@rulename=]'rulename',[@objname=]‘object_name’
  例如:execsp_bindrule'r_grade','sc.grade‘
  注意:
  规则不能绑定到text、image或timestamp列。
  如果规则与绑定的列不兼容,SQLServer将在插入值时返回错误信息。
  未解除绑定的规则,如果再次将一个新的规则绑定到列,旧的规则将自动被解除,只有近一次绑定的规则有效
  如果列中包含CHECK约束,则CHECK约束优先。
  ③解除规则的绑定
  使用sp_unbindrule存储过程。语法格式如下:
  sp_unbindrule[@objname=]'objectname'[,[@futureonly=]'futureonly_lag']
  例如:
  execsp_unbindrule'sc.grade'
  ④删除规则
  首先要解除规则的绑定,然后才能删除绑定
  例如:dropruler_grade