sql server 2008 数据库的完整性约束

原创 2015年11月14日 14:02:34

一、数据库完整性概述

 
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 as 1 

 
②绑定默认对象

默认对象创建后不能使用,必须首先将其绑定到某列或者用户自定义的数据类型上。其使用语法格式如下:

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<=100 and @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约束 
 
(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,性别‘男’或‘女’:
CREATE TABLE Student2(
       sno   int CONSTRAINT C1 CHECK (sno BETWEEN 10000 AND 99999),
       sname  CHAR(8)  CONSTRAINT C2 NOT NULL,
       sage  int  CONSTRAINT C3  CHECK (sage<30),
       ssex   VARCHAR(2)  CONSTRAINT C4 CHECK (ssex IN ('男', '女')),
       CONSTRAINT SK PRIMARY KEY(Sno)
);


博客园博客:欠扁的小篮子

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库中的完整性约束及实例

1 定义      数据完整性用于保证数据库中数据的正确性、一致性和可靠性。  2    类型  • 实体完整性(Entity Integrity)  • 域完整性(Domain Integr...
  • bzhxuexi
  • bzhxuexi
  • 2015年02月09日 15:36
  • 6999

SQL Server 创建表,添加约束

新建表,添加删除约束
  • yufeiyufei_fei
  • yufeiyufei_fei
  • 2017年06月06日 14:01
  • 643

SQL完整性约束

0. 前言完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。1. 单个关系上的约束1.1 not null 约束not null声明禁止在该属性上插入空值。任何可能导致向一个声明为not ...
  • okingniko
  • okingniko
  • 2016年11月06日 15:40
  • 986

数据库中的完整性约束及实例

1 定义      数据完整性用于保证数据库中数据的正确性、一致性和可靠性。  2    类型  • 实体完整性(Entity Integrity)  • 域完整性(Domain Integr...
  • bzhxuexi
  • bzhxuexi
  • 2015年02月09日 15:36
  • 6999

SQL Server选择题40个

1、数据库系统的核心是( ) A、数据库管理系统 B、数据库 C、操作系统 D、数据 2、以下( )不是数据库的模型 A、网状型 B、关系型 C、层次型 D、实体联系型 3、下...
  • zfj1981
  • zfj1981
  • 2013年12月09日 14:10
  • 2488

sql中表级约束和列级约束

在SQL SERVER中, (1) 对于基本表的约束分为列约束和表约束 约束是限制用户输入到表中的数据的值的范围,一般分为列级约束与表级约束。 列级约束有六种:主键Primary key、外键f...
  • l821788582
  • l821788582
  • 2017年03月19日 16:02
  • 3382

SQL Server 2008 转换为 SQL 2005 数据库 脚本生成方式(解决主键、索引、标识等数据库约束丢失)

要转换的数据库上右击,出现的快捷菜单中点击“任务 > 生成脚本”,在“脚本向导”中点击“下一步”,选中你要转换的数据库(如果前边已经选中,这次就是选中状态),勾选下部的“为所选数据库的所有对象编写脚本...
  • lanchengxiaoxiao
  • lanchengxiaoxiao
  • 2012年02月25日 09:55
  • 2681

SQL Server 2008编程入门经典笔记:约束

约束的类型 域约束,对列数据进行约束 实体约束,对行数据进行约束 参照完整性约束,比如:外键约束 键约束1、主键约束主键必须是唯一标识符,不能为NULL 1)在创建表的时候创建主键约束 直接在列名...
  • u011069189
  • u011069189
  • 2017年10月19日 09:31
  • 417

SQL Server 2008 如何查看与创建约束

原创地址:http://www.cnblogs.com/jfzhu/archive/2012/11/23/2785269.html 转载请注明出处   SQL Server中有五种约...
  • mituan1234567
  • mituan1234567
  • 2013年02月21日 16:41
  • 285

SQL Server 2008编程入门经典笔记(第六章:约束)

约束是一种限制。通过在列级或表级设置约束,确保数据符合某种数据完整性规则。 6.1.1 域约束 域约束处理一个或多个列。例如:想限定UnitPrice列的值大于等于0,那就是域约束。 6.1.2...
  • fengqinqdca
  • fengqinqdca
  • 2013年09月17日 11:18
  • 1084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql server 2008 数据库的完整性约束
举报原因:
原因补充:

(最多只允许输入30个字)