一、数据库完整性概述

 
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)
);

sql server 2008 数据库的完整性约束的更多相关文章

  1. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  2. SQL SERVER 2008数据库各版本功能对比

    微软SQL SERVER 2008数据库有6个版本,分别是数据中心版.企业版.标准版.Web版.工作组版.简易版,有时候购买的时候或需要使用某项功能时,需要了解各个版本的区别,功能差异,很多时候,大部 ...

  3. 通过SQL Server 2008数据库复制实现数据库同步备份

    SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主 ...

  4. SQL Server 2008 数据库镜像部署实例之三 配置见证服务器

    SQL Server 2008 数据库镜像部署实例之三 配置见证服务器 前面已经完成了镜像数据库的配置,并进行那个了故障转移测试.接下来将部署见证服务器,实现自动故障转移. 一.关于见证服务器 1.若 ...

  5. SQL Server 2008 数据库镜像部署实例之二 配置镜像,实施手动故障转移

    SQL Server 2008 数据库镜像部署实例之二 配置镜像,实施手动故障转移 上一篇文章已经为配置镜像数据库做好了准备,接下来就要进入真正的配置阶段 一.在镜像数据库服务器上设置安全性并启动数据 ...

  6. SQL Server 2008 数据库镜像部署实例之一 数据库准备

    SQL Server 2008 数据库镜像部署实例之一 数据库准备 一.目标 利用Sql Server 2008 enterprise X64,建立异步(高性能)镜像数据库,同时建立见证服务器实现自动 ...

  7. SQL Server 2008 数据库同步的两种方式 (发布、订阅)

    参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步

  8. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

  9. 还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案

    还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案如下 关键SQL语句: ALTER DATABASE [dateba ...

随机推荐

  1. js中location.href的用法

    Javascript中的location.href有很多种用法,主要如下: self.location.href="/url" 当前页面打开URL页面 ocation.href=& ...

  2. Windows环境下maven 安装与环境变量配置

    Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...

  3. nyoj 1029/hdu 3714 Error Curves 三分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3714 懂了三分思想和F(x)函数的单调性质,这题也就是水题了 #include "stdio ...

  4. apache性能测试工具ab使用详解

    下面我们对这些参数,进行相关说明.如下:-n在测试会话中所执行的请求个数.默认时,仅执行一个请求.-c一次产生的请求个数.默认是一次一个.-t测试所进行的最大秒数.其内部隐含值是-n 50000,它可 ...

  5. 三星嵌入式开发平台 三星Cortex-A9 4412 POP与SCP对比

    iTOP-4412核心板是迅为电子推出的一款高端四核核心板,其中分为POP封装与SCP封装,配备三星Exynos 4412四核处理器,主频为1.4GHz,内置16GB存储空间.该板设计小巧.配备三星自 ...

  6. Sql-oracle and sqlserver differences

    1.string contact operator Sqlserver use + or contact(sqlserver 2012) In oracle, you can also use con ...

  7. socket通信入门

    以一个基本的python程序为例解释 源代码如下: #!/usr/bin/env python  #指出代码用什么程序去运行它.首先会到env设置里查找python的安装路径,再调用对应路径下的解释器 ...

  8. 利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

    基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢 ...

  9. redis 一二事 - 搭建集群缓存服务器

    在如今并发的环境下,对大数据量的查询采用缓存是最好不过的了,本文使用redis搭建集群 (个人喜欢redis,对memcache不感冒) redis是3.0后增加的集群功能,非常强大 集群中应该至少有 ...

  10. 第8课 goto 和 void 分析

    1. 遭人遗弃的goto (1)高手潜规则:禁用goto (2)项目经验:程序质量与goto出现的次数成反比 (3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式 [实例分析]goto副作 ...