热门标签 | 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. 空值、缺省:修改/删除父表的值,子表 相应值为空或为缺省值。

推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 本文介绍了如何使用 PostgreSQL 的 `UPDATE ... FROM` 语法,通过映射表实现对多行记录进行高效的批量更新。这种方法不仅适用于单列更新,还支持多列的同时更新。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用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社区 版权所有