热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据库完整性是什么概念?

一、完整性的概念之所以要引入数据完整性是为了在数据的添加、删除、修改等操作中不出现数据的破坏或多个表数据不一致。数据完整性是指存储在数据库中的数据正确无误并且相关数据具有一致性。二、完整性的类型四类完整性约束:域完整性约束:实体完整性

一、完整性的概念 之所以要引入数据完整性是为了在数据的添加、删除、修改等操作中不出现数据的破坏或多个表数据不一致。数据完整性是指存储在数据库中的数据正确无误并且相关数据具有一致性。 二、完整性的类型 四类完整性约束: 域完整性约束: 实体完整性

一、完整性的概念

之所以要引入数据完整性是为了在数据的添加、删除、修改等操作中不出现数据的破坏或多个表数据不一致。数据完整性是指存储在数据库中的数据正确无误并且相关数据具有一致性。

二、完整性的类型

四类完整性约束:

  1. 域完整性约束:
  2. 实体完整性约束: PRIMARY KEY
  3. 引用完整性约束:FOREIGN KEY,REFERENCE
  4. 用户定义完整性约束: CHECK, DEFAULT, NOT NULL

1)实体完整性

实体:表中的记录,一个实体就是指表中的一条记录。

实体完整性:在表中不能存在完全相同的记录,且每条记录都要具有一个非空且不重复的主键值。

实现实体完整性的方法:设置主键、惟一索引、惟一约束。

2)域完整性

域完整性:向表中添加的数据必须与数据类型、格式及有效的数据长度相匹配。

实现域完整性的方法:CHECK约束、外键约束、默认约束、非空定义、规则以及在建表时设置的数据类型。

3)参照完整性

参照完整性:又称为引用完整性。是指通过主键与外键相联系的两个表或两个以上的表,相关字段的值要保持一致。

实现实体完整性的方法:外键约束。

4)用户定义的完整性

用户定义的完整性:是根据具体的应用领域所要遵循的约束条件由用户自己定义的特定的规则。

三、约束的类型

约束:SQL Server提供的自动强制数据完整性的一种方法。它通过定义列的取值规则来维护数据的完整性。

常用约束:NOT NULL,CHECK、UNIQUE、PRIMARY KEY、FOREIGN KEY、DEFAULT

1)主键约束:在表中定义一个主键来惟一标识表中的每行记录

特点:每个表中只能有一个主键,主键可是一列,也可是多列;主键不能为空;主键值不能重复

2)UNIQUE约束:它主要用来限制表的非主键列中的值不能重复。

特点:一个表中可以定义多个惟一约束

3)NOT NULL约束:它用来设定某列值不能为空。

特点:如果设定某列为NOT NULL,则在添加记录时,则此列必须插入数据。

4)CHECK约束:它使用逻辑表达式来限制表中的列可以接受哪些数据值。

例如:成绩值应该在0-100之间,则可以为成绩字段创建CHECK约束,使取值在正常范围内。

5)DEFAULT约束:它为表中某列建立一个默认值,当为表中添加记录时,如果没有提供输入值,则自动以默认值赋给该列。

特点:默认值可以为常量、函数或表达式。使用默认值可以提高数据输入的速度。

6)FOREIGN KEY约束

外键:是指一个表中的一列或列组合,它虽不是该表的主键,但是另一个表的主键。

特点:实现两表之间相关数据的一致性。

更新数据库时,表中不能出现不符合完整性要求的记录,以保证为用户提供正确、有效的数据。实现该目的最直接的方法,是在编写数据库应用程序时,对每个更新操

作都进行完整性检查。但这种检查往往是复杂、重复、低效的。

SQL把各种完整性约束作为数据库模式定义的一部分,由数据库管理系统维护,这样即可有效防止对数据库的意外破坏,提高了完整性检测的效率,又减轻了编程人员的负担。

实体完整性和主键:实体完整性是通过主键(PRIMARY KEY)的定义来实现的。一旦某个属性或属性组被定义为主键,该主键的每个属性就不能为空值,并

且在表中不能出现主键值完全相同的两个记录。

主键可以在CREATE TABLE语句中使用PRIMARY KEY定义。有两种定义主键的方法:一种是在属性后增加关键字,另一种是在属性表中加入额外的定义主键的子句:PRIMARY KEY(主键属性名表)。

(1)属性后增加关键字定义:

CREATE TABLE StudentInfo
(
    StudentID       char(8)    PRIMARY KEY,
    StudentName    varchar(10),
    StudentSex      bit
);

(2)加入额外的定义主键的子句:

CREATE TABLE StudentInfo
(
    StudentID        char(8),
    StudentName    varchar(10),
    StudentSex        bit,
    PRIMARY KEY(StudentID)
);

如果表的主键只含有单个属性,上面的两种方法都可以使用。如果主键由多个属性组成,只能使用第二种方法。

除了主键,SQL提供了类似候选码的说明方法,使用关键字UNIQUE定义(与候选码不同的是:定义为UNIQUE的属性可以定义为空值,但只能有一个记录该属性的值为NULL),说明该属性(或属性组)的值不能重复。

一个表中只能有一个主键,但可以有多个“UNIQUE”定义。

(1)外部码约束的说明

说明外部码的方法有两种:

在该属性的说明(属性名、类型)后直接加上关键字REFERENCES,后跟对应表的主键说明

格式为:REFERENCES<父表名>(<属性名>)

说明RelationInfo表中StudentID为外部码,参照关系为StudentInfo。

CREATE TABLE RelationInfo
(
    RelationID    int identity(1, 1),
    StudentID    char(8) REFERENCES StudentInfo(StudentID),
    DepartID     char(4)   
);

在CREATE TABLE?语句的属性清单后,加上外部码的说明子句

格式为:FOREIGN (<属性名表>)REFERENCES<父表名>(<属性名表>)

CREATE TABLE RelationInfo
(
    RelationID    int identity(1, 1),
    StudentID    char(8) ,
    DepartID     char(4) ,
    FOREIGN KEY (StudentID) REFERENCES StudentInfo(StudentID)  
);

(2)参照完整性约束的实现策略

当用户的操作违反了上述规则时,SQL?提供了两种可选方案供数据库实现者使用:RESTRICT(限制策略);CASCADE(级联策略);

<1>限制策略

限制策略是SQL的默认策略,任何违反参照完整性的更新均被系统拒绝。

<2>级联策略

当用户删除或更新外键所指向的键时,SQL提供了另一种方案,即级联策略。

通过在REFERENCES子句后添加ON DELETE?和?ON UPDATE子句实现:

[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]

如果没有指定ON DELETE?或?ON UPDATE,则默认为NO ACTION。

ON DELETE NO ACTION

指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚DELETE。

ON UPDATE NO ACTION

指定如果试图更新某行中的键值,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚?UPDATE。

CASCADE?允许在表间级联键值的删除或更新操作,这些表的外键关系可追溯到执行修改的表。不能为任何具有?timestamp?列的外键和主键指定?CASCADE。

ON DELETE CASCADE

指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。

ON UPDATE CASCADE

指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。

n 用户自定义完整性约束:SQL提供非空约束、对属性的CHECK约束、对元组的CHECK约束、触发器等来实现用户的完整性要求。

<1>基于属性的CHECK约束

使用CHECK(检查)子句可保证属性值满足某些前提条件。CHECK子句的一般格式为:

CHECK<条件>

属性的CHECK约束既可跟在属性的定义后,也可在定义语句中另增一子句加以说明。

设定StudentInfo表中age值不能小于18、大于65。只需将age属性说明为如下形式:

age int CHECK(age >= 18 and age <= 65)

<2>基于元组的约束

CREATE TABLE salary
(
    Eno char(4),
    Basepay decimal(7, 2),
    Insure decimal(7, 2),
    Fund decimal(7, 2),
    CHECK (Insure + Fund 

上面例子中,CHECK约束涉及到表中多个属性,为元组约束。

?约束的更新:约束与数据库中的表、视图等一样,可以进行增加、删除和修改的更新操作。为了更新约束,需要在定义约束是对约束进行命名,在约束前加上关键字CONSTRAINT和该约束的名称。

例如要说明StudentInfo表中的主键时,将其命名为PK_StudentInfo_ID

CREATE TABLE StudentInfo
(
    StudentID        char(8),
    StudentName    varchar(10),
    StudentSex        bit,
    CONSTRAINT PK_StudentInfo_ID  PRIMARY KEY(StudentID)
);

可以使用ALTER TABLE语句来更新与属性或表有关的约束。

(1)删除约束:

ALTER TABLE DROP CONSTRAINT?约束名

(2)增加约束

ALTER TABLE ADD CONSTRAINT?约束名 约束定义。

更新时的完整性

  1. 修改/删除约束:子表有相应记录时,父 表该行不能更新。
  2. 删除级联:父表删除一行,子表相应行 删除。
  3. 更新级联:父表更新一行,子表相应行更新。
  4. 空值、缺省:修改/删除父表的值,子表 相应值为空或为缺省值。

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
手机用户2602918063
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有