sqlserver2008数据库的完整性约束
⼀、数据库完整性概述
1.数据库的完整性:
①数据库的完整性是指数据的正确性和相容性
②数据库完整性是防⽌不合语义或不正确的数据进⼊数据库
③完整性体现了是否真实地反映现实世界
例:
学⽣的年龄必须是整数,取值范围为14-29;
学⽣的性别只能是男或⼥;
学⽣的学号⼀定是唯⼀的;
学⽣所在的系必须是学校开设的系;
2.DBMS维护数据库完整性的机制:
①提供定义完整性约束条件的机制
DBMS应提供定义数据库完整性约束条件,并把它们存⼊数据库中。
②提供完整性检查的⽅法
检查数据是否满⾜完整性约束条件的机制称为完整性检查。⼀般在INSERT、UPDATE、DELETE语句执⾏后开始检查。
3.违约处理
DBMS若发现⽤户的操作违背了完整性约束条件,就采取⼀定的动作以保证数据的完整性,如拒绝执⾏该操作,或级联执⾏其他操作。
⼆、缺省(默认值)和规则
缺省和规则来源于由Sybase开发的S默认值QL Server,在⽼版本的SQL Server或者升级版本中都有缺省和规则的使⽤。
缺省是为列提供数据的⼀种⽅式,如果⽤户进⾏INSERT操作时不为列输⼊数据,则使⽤缺省值。
规则是当⽤户进⾏INSERT或uPDATE操作时,对输⼊列中的数据设定的取值范围,是实现域完整性的⽅式之⼀。
缺省与规则有以下特点:
(1)缺省与规则是数据库对象,它们是独⽴于表和列⽽建⽴的。
(2)缺省与规则建⽴后与列或数据类型产⽣关联,列和数据类型就具有了缺省与规则的属性。
(3)缺省与规则定义后,可以重复使⽤,可以绑定到多个列或数据类型上。
(4)缺省与规则不随表同时调⼊内存,当⽤到时才被调⼊内存,这可能会使程序执⾏出现延时。
缺省和规则对象通常只在它所创建的数据库中有效,不是ANSI标准,⼀般不提倡使⽤。
应尽可能使⽤约束,任何可以使⽤缺省与规则的地⽅都有可以使⽤约束。
1. 缺省
在SQL Server中,有两种使⽤默认值的⽅法:
①在创建表时,指定默认值。
  ⽤SQL Server Management Studio创建表时在设计表时指定默认值,可以在输⼊字段名称后,设定该字段的默认值。  或使⽤CREATE TABLE语句中的DEFAULT⼦句指定默认值。
②使⽤CREATE DEFAULT语句创建默认对象后,使⽤存储过程sp_bindefault将该默认对象绑定到列上。
默认值对象是单独存储的,删除表的时候,DEFAULT约束会⾃动删除,但是默认值对象不会被删除。
创建默认值对象后,需要将其绑定到某列或者⽤户⾃定义的数据类型上。
主要操作:
①创建默认值对象
②绑定默认值对象
③解除默认值对象的绑定
④查看默认值对象
⑤删除默认值对象
①创建默认对象
可以使⽤CREATE DEFAULT语句创建默认对象。其语法格式如下:
CREATE DEFAULT default  AS constant_expression
例如:create default d_grade as1
②绑定默认对象
默认对象创建后不能使⽤,必须⾸先将其绑定到某列或者⽤户⾃定义的数据类型上。其使⽤语法格式如下:
sp_bindefault [@defname = ] 'default', [@objname = ] 'object_name'  [, [@futureonly = ] 'futureonly_flag']
其中: [, [@futureonly = ] ‘futureonly_flag’]仅在此之后将默认值绑定到⽤户定义的数据类型时才使⽤。
例如:exec sp_bindefault 'd_grade', ‘sc.grade'
③解除默认对象的绑定
解除绑定可以使⽤sp_unbindefault存储过程。其语法格式如下:
sp_unbindefault [@objname = ] 'object_name'
例如:exec sp_unbindefault ‘sc.grade'
④查看默认对象
exec sp_help d_grade
exec sp_helptext d_grade
⑤删除默认对象
在删除默认对象之前,⾸先要确认默认对象已经解除绑定。删除默认对象使⽤DROP DEFAULT语句。其语法格式如下:DROP DEFAULT {default} [,…n]
例如:drop default d_grade
2.规则
规则⽤以限制存储在表中或⽤户⾃定义数据类型的值,是独⽴的数据库对象。
将规则绑定到列或⽤户⾃定义数据类型时,规则才起作⽤。
表中的每列或每个⽤户定义数据类型只能和⼀个规则绑定。但每列可应⽤多个CHECK约束。
如果要删除规则,应确定规则已经解除绑定。
①创建规则
CREATE RULE语句,其语法格式如下:
CREATE RULE rulename AS condition_expression
其中各参数含义如下:
rulename 是新规则的名称。
condition_expression是定义规则的条件。
例如:create rule r_grade as@grade<=100and@grade>=0
②绑定规则
使⽤sp_bindrule存储过程,语法格式为:
sp_bindrule [@rulename = ] 'rulename',  [@objname = ]  ‘object_name’
例如:exec sp_bindrule 'r_grade','sc.grade‘
注意:
规则不能绑定到text、image或timestamp列。
如果规则与绑定的列不兼容,SQL Server将在插⼊值时返回错误信息。
未解除绑定的规则,如果再次将⼀个新的规则绑定到列,旧的规则将⾃动被解除,只有最近⼀次绑定的规则有效
如果列中包含CHECK约束,则CHECK约束优先。
③解除规则的绑定
使⽤sp_unbindrule存储过程。语法格式如下:
sp_unbindrule [@objname = ] 'object name'  [,[@futureonly = ] 'futureonly_ lag']
例如:
exec sp_unbindrule 'sc.grade'
④删除规则
⾸先要解除规则的绑定,然后才能删除绑定
例如:drop rule r_grade
三、约束
SQL Server 2008提供的强制数据完整性的机制:
①PRIMARY KEY 约束
②FOREIGN KEY 约束
③UNIQUE 约束
④CHECK 约束
⑤NOT NULL(⾮空性)
⑥IDENTITY 约束
使⽤约束优先于使⽤触发器、规则和默认值
查询优化器使⽤约束定义⽣成⾼性能的查询执⾏计划
①PRIMARY KEY 约束:
可以在下⾯情况下使⽤:
(1)作为表定义的⼀部分在创建表时创建。
(2)添加到尚没有PRIMARY KEY约束的表中(⼀个表只能有⼀个PRIMARY KEY约束)。
(3)如果已有PRIMARY KEY约束,则可对其进⾏修改或删除。
特点:
(1)每个表都应有⼀个主键,主键值唯⼀。
(2)主键内的任何列不能为空(null)。
(3)要使⽤TRansact-SQL修改PRIMARY KEY,必须先删除现有的PRIMARY KEY约束,然后再重新创建。
(4)创建表时指定主键,sql server会⾃动创建⼀个名为“PK_”且后跟表名的主键索引。如果不指定索引类型,则默认为聚集索引。该索引只能在删除与
它保持联系的表或主键约束时才能删除。
②FOREIGN KEY约束
标识表之间的关系,⽤于强制参照完整性,为表中⼀列或多列提供参照完整性。 FOREIGN KEY约束也可以参照⾃⾝表中的其他列(例如:学⽣表中的“班长学号”列参照“学号”列),这种参照称为⾃参照。
FOREIGN KEY约束可以在下⾯情况下使⽤:
(1)作为表定义的⼀部分在创建表时创建。
(2)如果现有表的某列与另⼀个表已有的PRIMARY KEY约束或UNIQUE约束相关联,则可向现有表添加FOREIGN KEY约束。
(3)对已有的FOREIGN KEY约束进⾏修改或删除。
使⽤FOREIGN KEY约束,应注意的⼏个问题:
(1)每个表最多可以有253个FOREIGN KEY约束。
(2)FOREIGN KEY约束只能参照同⼀个数据库中的表,⽽不能参照其他数据库中的表。
(3)FOREIGN KEY⼦句中的列数⽬和每个列指定的数据类型必须和REFERENCES⼦句中的列相同。
(4)FOREIGN KEY约束不能⾃动创建索引。
(5)在临时表中,不能使⽤FOREIGN KEY约束。
(6)如果⼀个外键没有对应的主键值,则不能插⼊带该值的⾏。
③UNIQUE约束
sql约束条件大于0
(1)UNIQUE约束在列集内强制执⾏值的唯⼀性。
(2)对于UNIQUE约束中的列,表中不允许有两⾏包含相同的⾮空值。
(3)SQL Server创建了UNIQUE约束后会⾃动创建UNIQUE索引来强制UNIQUE约束的唯⼀性要求。
(4)如果插⼊重复⾏,SQL Server将返回错误信息。
(5)向表中的现有列添加UNIQUE约束时,默认情况下SQL Server 2008检查列中的现有数据确保除NULL外的所有值均唯⼀。
(6)UNIQUE约束与主键约束的区别:主键也强制执⾏唯⼀性,但主键不允许空值,⽽且每个表中主键只能有⼀个,但UNIQUE列可以有多个,可以取空值。
(7)UNIQUE约束优先于唯⼀索引。
④CHECK约束
(1)CHECK约束通过限制⽤户输⼊的值来加强域完整性。
(2)它指定应⽤于列中输⼊的所有值的布尔(取值为TRUE或FALSE)搜索条件,拒绝所有不取值为TRUE的值。
(3)可以为每列指定多个CHECK约束。
⑤IDENTITY约束
⾃动编号约束⼜称作标识列,采⽤数字编号的⽅式依次增加⼀个增量。是为那些数字顺序递增的列准备的约束,可以⾃动完成数值添加。
(1)标识种⼦
(2)标识增量
(3)标识列的数据类型
四、完整性约束命名⼦句
完整性约束命名⼦句的格式:
CONSTRAINT <;完整性约束条件名>[PRIMARY KEY短语|FOREIGN KEY 短语|CHECK短语]
例:建⽴学⽣登记表Student2,要求学号在10000⾄99999之间,姓名不能取空值,年龄⼩于30,性别‘男’或‘⼥’:
1CREATE TABLE Student2(
2        sno  int CONSTRAINT C1 CHECK (sno BETWEEN10000AND99999),
3        sname  CHAR(8)  CONSTRAINT C2 NOT NULL,
4        sage  int CONSTRAINT C3  CHECK (sage<30),
5        ssex  VARCHAR(2)  CONSTRAINT C4 CHECK (ssex IN ('男', '⼥')),
6CONSTRAINT SK PRIMARY KEY(Sno)
7 );

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。