第五章:数据库完整性

2023-11-14

数据库完整性


集成环境:Microsoft SQL Server Management Studio 18

这个是指数据的正确性和数据的相容性

为了数据库的完整性,数据库管理系统必须提供以下策略

  • 提供定义定义完整性约束条件的机制

    • 完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件
    • SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性
    • 这些完整性一般由SQL的数据定义语言语句来实现
  • 提供完整性检查方法

    • 数据库管理 系统中检查数据是否满足完整性约束条件机制称为完整性检查
    • 一般在 delete,update,insert语句后执行检查,也可以在事务提交后检查
  • 违约处理

    • 数据库管理系统若发现用户违背了数据库完整性约束条件就应该采取一定动作
      • 拒绝(no action)执行该操作
      • 级联(cascade)执行其他操作

本章主要内容

5.1参照完整性
5.1.1实体完整性定义
(1)	在列级定义主码
CREATE TABLE girlfriend
(stuname char(10) primary key,
girlfriendName char(10) NOT NULL,
girlfriendAge char(10),
girlfriendPhone int);2)在表级定义主码
CREATE TABLE girlfriend
(stuname char(10),
girlfriendName char(10) NOT NULL,
girlfriendAge char(10),
girlfriendPhone int
primary key(stuname));

5.1.2实体完整性的违约处理和检查
  • **插入或对主码列进行更新操作时,**RDBMS按照实体完整性规则自动进行检查。包括:

    • 检查主码值是否唯一,如果不唯一则拒绝插入或修改

    • 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

检查主码是否唯一的一种办法是全表扫描,为了避免全表扫描,RDBMS核心一般在主码上自动建立索引

5.2参照完整性
5.2.1参照完整性定义
(1)	在表级定义参照完整性
将女朋友表中的学生名与学生表中的学生名相关连
CREATE TABLE girlfriend
(stuname nvarchar(50) primary key,
girlfriendName char(10) NOT NULL,
girlfriendAge char(10),
girlfriendPhone int,
foreign key(stuname) references [dbo].[Student](Sname) -- 在表级定义参照完整性
);

5.2.2参照完整性的违约处理和检查

一个参照完整性是将两个表中相应的元组联系起来,对参照表和被参照表进行增删改查操作时有可能破坏参照完整性,必须进行检查

被参照表(Student) 参照表(girfriend) 违约处理
可能破坏参照完整性 插入元组 拒绝
可能破坏参照完整性 修改外码值 拒绝
删除元组 可能破坏参照完整性 拒绝/级连删除/设置为空值
修改主码值 可能破坏参照完整性 拒绝/级连修改/设置为空值

参照完整性的违约处理

(1) 拒绝(no action)执行

  • 不允许执行该操作,该策略一般是默认策略

(2)级联(CASCADE)操作

  • 当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组

(3)设置为空值(SET-NULL)

  • 当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

对于参照完整性,除了定义外码,还定义外码是否为空

显示处理参照完整性违约处理示例

2)显示参照完整性的违约示例
CREATE TABLE girlfriend2
(stuname nvarchar(50) primary key,
girlfriendName char(10) NOT NULL,
girlfriendAge char(10),
girlfriendPhone int,
foreign key(stuname) references [dbo].[Student](Sname) -- 在表级定义参照完整性
ON DELETE CASCADE     /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE /*级联更新SC表中相应的元组*/
--ON DELETE NO ACTION 	
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
--ON UPDATE NO ACTION   
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);

5.3用户自定义的完整性
5.3.1属性上的约束条件

create table 时定义属性上的约束条件

  • 列值非空(not null)
  • 列值唯一(unique)
  • 检查列值是否满足一个表达式(check)

(1)列值空值

CREATE TABLE girlfriend
(stuname nvarchar(50),
girlfriendName char(10) NOT NULL,--列值非空
girlfriendAge char(10),
girlfriendPhone int
);

(2)列值唯一

CREATE TABLE girlfriend
(stuname nvarchar(50) UNIQUE,--列值唯一
girlfriendName char(10), 
girlfriendAge char(10),
girlfriendPhone int UNIQUE,--列值唯一);

(3)check约束,对性别,年龄等约束;

CREATE TABLE girlfriend4
(stuname nvarchar(50),
girlfriendName char(10),
girlfriendSEX char(2) check(girlfriendSEX IN ('男','女')),--性别约束
girlfriendAge int check(girlfriendAge between 18 and 20) ---年龄约束
foreign key(stuname) references [dbo].[Student](Sname) -- 在表级定义参照完整性
);

属性上约束条件检查和违约处理

  • 插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足

  • 如果不满足则操作被拒绝执行

5.3.2元组上的约束条件

在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制

同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件

CREATE TABLE girlfriend0
(stuname nvarchar(50),
girlfriendName char(10),
girlfriendSex char(2),
girlfriendAge int check(girlfriendAge between 18 and 20),
girlfriendPhone int,
CHECK (girlfriendSex='女' OR girlfriendName NOT LIKE 'Ms.%')
/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
);
性别是女性的元组都能通过该项检查,因为Ssex=‘女’成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头

元组上约束条件检查和违约处理

  • 插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足

  • 如果不满足则操作被拒绝执行

5.4完整性约束命名子句

(1)完整性约束命名子句

constraint <完整性约束条件名> <完整性约束条件>

CREATE TABLE girlfriend10
(stuname nvarchar(50) CONSTRAINT C1 NOT NULL,
girlfriendName char(10),
girlfriendSex char(2) CONSTRAINT C2 CHECK (girlfriendSex IN ( '男','女')),
girlfriendAge int CONSTRAINT C3 check(girlfriendAge between 18 and 20), girlfriendPhone int,
);

(2)删除约束

ALTER TABLE girlfriend10 DROP CONSTRAINT C1;

(3)修改约束

ALTER TABLE Student ADD CONSTRAINT C3  check(girlfriendAge between 8 and 30);
5.5断言
  • sql中,可以使用create assertion语句,通过声明性断言来指定更具一般性的约束
  • 可以定义涉及多个表或聚集操作的比较复杂的完整性约束。
  • 断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

(1)定义断言

CREATE ASSERTION <断言名> <CHECK子句>

[5.18] 限制数据库课程最多60名学生选修
	CREATE ASSERTION ASSE_SC_DB_NUM
	CHECK (60 >= (select count(*)
                  /*此断言的谓词涉及聚集操作count的SQL语句*/
    		            From Course,SC
    		    	Where SC.Cno=Course.Cno and  Course.Cname ='数据库')
			   	);

(2)删除断言

DROP ASSERTION <断言名>;

如果断言很复杂,则系统在检测和维护断言上的开销较高,这是在使用断言时应该注意的。

5.7触发器

触发器(Trigger)是用户定义在关系表上一类事件驱动的特殊过程

  • 触发器保存在数据库服务器中
  • 任何用户对表的增删改查均有服务器自动激活相应的触发器
  • 触发器可以实施更为复杂的检查和操作,具有更精致和更强大的数据控制能力
5.7.1定义触发器
CREATE TRIGGER语法格式
	   CREATE TRIGGER <触发器名>  
       {BEFORE | AFTER} <触发事件> ON <表名>
       REFERENCING NEW|OLD ROW AS<变量>
       FOR EACH  {ROW | STATEMENT}
       [WHEN <触发条件>]<触发动作体>

定义触发器语法说明

(1)拥有表的用户才可以定义触发器

(2) 触发器名

  • 触发器名可以包括模式名,也可以不包括模式名
  • 同一模式下触发器名必须唯一
  • 触发器名和表必须在同一模式模式下

(3)表名

  • 触发器只能定义在表上,不能定义在视图上
  • 基本表发生变化时,将激活定义在该表上的触发器

(4)触发事件

  • 触发事件可以是INSERT、DELETE或UPDATE

    也可以是这几个事件的组合

  • 还可以UPDATE OF<触发列,…>,即进一步指明修改哪些列时激活触发器

  • AFTER/BEFORE是触发的时机

    • AFTER表示在触发事件的操作执行之后激活触发器
    • BEFORE表示在触发事件的操作执行之前激活触发器

(5)触发器类型

  • 行级触发器(FOR EACH ROW)
  • 语句级触发器(FOR EACH STATEMENT)
[5.21]当对表SC的Grade属性进行修改时,若分数增加了10%则将此次操作记录到下面表中:
     SC_U(Sno,Cno,Oldgrade,Newgrade)
    其中Oldgrade是修改前的分数,Newgrade是修改后的分数。
	CREATE TRIGGER  SC_T		
	AFTER UPDATE OF Grade ON SC
     REFERENCING
	      OLD row  AS  OldTuple,
	      NEW row AS  NewTuple
	FOR EACH ROW 	
	WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade)
	    INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)  
VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)
[5.22] 将每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中。

	CREATE TRIGGER Student_Count
	AFTER INSERT ON Student  
	        /*指明触发器激活的时间是在执行INSERT后*/     
	REFERENCING
     	NEW TABLE AS DELTA
	FOR EACH STATEMENT  
	       /*语句级触发器, 即执行完INSERT语句后下面的触发动作体才执行一次*/
		INSERT INTO StudentInsertLog (Numbers)
   		SELECT COUNT(*) FROM DELTA
[5.23] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
    
	    CREATE TRIGGER Insert_Or_Update_Sal 
         BEFORE INSERT OR UPDATE ON Teacher  
         			             /*触发事件是插入或更新操作*/
          FOR EACH ROW        /*行级触发器*/
          BEGIN                             /*定义触发动作体,是PL/SQL过程块*/
             		 IF (new.Job='教授') AND (new.Sal < 4000) 
             	 THEN  new.Sal :=4000;                
           	 END IF;
        END;                               

例子

(1)定义一个before级触发器
--创建insert update 触发器
create trigger Insert_Or_Update ON girlfriend
after insert,update
as begin
update girlfriend set girlfriendSalary = 100 where girlfriendSalary<100;
end

插入数据

insert into girlfriend([stuname],[girlfriendName],[girlfriendSalary],[girlfriendAge],[girlfriendPhone]) values('李勇','花花',10,14,12345);
insert into girlfriend([stuname],[girlfriendName],[girlfriendSalary],[girlfriendAge],[girlfriendPhone]) values('李2勇','花花1',101,14,12345);
insert into girlfriend([stuname],[girlfriendName],[girlfriendSalary],[girlfriendAge],[girlfriendPhone]) values('李3勇','花花2',15,14,12345);

image-20211128223318063

5.7.2激活出发器

触发器的执行,是由触发事件激活的,并由数据库服务器自动执行

5.7.3删除触发器

删除触发器的SQL语法

DROP TRIGGER <触发器名> ON <表名>;

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五章:数据库完整性 的相关文章

  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • 【计算机毕业设计】个人日常事务管理系统

    进入21世纪网络和计算机得到了飞速发展 并和生活进行了紧密的结合 目前 网络的运行速度以达到了千兆 覆盖范围更是深入到生活中的角角落落 这就促使 管理系统的发展 管理系统可以实现远程处理事务 远程工作信息和随时追踪工作的状态 网上管理系统给
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 【计算机毕业设计】线上招聘问答系统

    计算机网络发展到现在已经好几十年了 在理论上面已经有了很丰富的基础 并且在现实生活中也到处都在使用 可以说 经过几十年的发展 互联网技术已经把地域信息的隔阂给消除了 让整个世界都可以即时通话和联系 极大的方便了人们的生活 所以说 线上招聘问
  • 【计算机毕业设计】学生就业管理系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统学生就业信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难题开
  • 【计算机毕业设计】北关村基本办公管理系统

    在如今社会上 关于信息上面的处理 没有任何一个企业或者个人会忽视 如何让信息急速传递 并且归档储存查询 采用之前的纸张记录模式已经不符合当前使用要求了 所以 对北关村基本办公信息管理的提升 也为了对北关村基本办公信息进行更好的维护 北关村基
  • 5个步骤,教你瞬间明白线程和线程安全

    记得今年3月份刚来杭州面试的时候 有一家公司的技术总监问了我这样一个问题 你来说说有哪些线程安全的类 我心里一想 这我早都背好了 稀里哗啦说了一大堆 他又接着问 那你再来说说什么是线程安全 然后我就GG了 说真的 我们整天说线程安全 但是对
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • 30天精通Nodejs--第二十天:express-操作mysql

    目录 前言 安装依赖并配置MySQL连接 安装mysql2库 配置连接信息 在Express应用中使用MySQL 结合Express路由实现CRUD操作 整合到主应用 结语 前言 在Node js中使用Expre
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升

随机推荐

  • 递归遍历树节点

    考虑这样一种场景 从一个object找到id对应的对象 obj如下结构 调用 fn obj 121 返回 对应object id 121 child const obj id 0 child id 1 child id 12 child i
  • Failed to read the 'localStorage' property from 'Window' 的解决办法

    参考链接 https stackoverflow com questions 30481516 iframe in chrome error failted to read localstorage from window access d
  • 【PHP小皮】使用教程

    博主介绍 主攻JAVA 因不可逆的原因 被迫学PHP 刚人门多多关照 文章目录 前言 一 官网下载小皮 二 使用步骤 1 打开小皮页面 2 使用步骤如下 总结 前言 随着快爱情的发展 php也不是那么的繁琐 下载集成工具小皮就可以省去很多时
  • 史上最全的maven的pom.xml文件详解

    本文转自 https www cnblogs com hafiz p 5360195 html 原作者 阿豪聊干货
  • Flask后端笔记(二)request、bort、响应、session、钩子

    Flask后端笔记 获取请求参数 上传文件 with的使用 bort函数与自定义异常处理 abort函数 自定义异常处理 返回的响应数据 元组 make response json模块的使用 使用jsonify返回json数据 重定向 设置
  • 最新的单机Lustre文件系统的安装

    1 单机Lustre的搭建 主机名 IP地址 内存 添加的共享磁盘大小 Centos7 9 test机 192 168 10 30 24 1G 20G 1 安装E2fsprogs包 下载OSS服务器所需要的包 E2fsprogs包只是在Ex
  • 该linux文件目录的owner权限

    sudo chown R admusr 要改的用户名 admusr path
  • “过早优化是万恶之源”这句话的源头

    来自于一篇大神的论文 而且原意没有一句话那么简单 Premature optimization is the root of all evil Programmers waste enormous amounts of time think
  • python 下载安装

    在下载Python之前我们要明确我们的开发环境的操作系统 这里我们选择Windows Python下载步骤 Python安装步骤 测试安装是否成功 注意 如果输入python后 没有出现如图效果 而是显示 python 不是内部或外部命令
  • .NET Core 获取自定义配置文件信息(多种方式)

    引用 Microsoft AspNetCore App 元包或将包引用添加到 Microsoft Extensions Options ConfigurationExtensions 包 简而言之 直接可以用 Appsetting json
  • ES分布式搜索引擎

    初始化RestClient 引入依赖 因为SpringBoot默认的ES版本是7 6 2 所以我们需要覆盖默认的ES版本
  • Linux用nohup后台运行python程序及停止

    在Ubuntu上用python flask写了一个后端代码 每次运行要CMD先远程连上服务器 然后python xxx py启动 这样操作会让cmd窗口被占用 没办法进行其他操作 ls cd这种 如果把窗口关了 程序就停止了 看了网上的例子
  • CTFSHOW【萌新计划】Writeup

    CTFSHOW 萌新计划 web1 萌新计划 web2 萌新计划 web3 萌新计划 web4 萌新计划 web5 萌新计划 web6 萌新计划 web7 萌新计划 web8 萌新计划 web9 萌新计划 web10 萌新计划 web11
  • 《我的眼睛--图灵识别》第五章:基础:形状识别

    我的眼睛 图灵识别 第五章 基础 形状识别 1 图形认识 三角形 三角形是由同一平面内不在同一直线上的三条线段 首尾 顺次连接所组成的封闭图形 三角形按边分有不等边三角形 等腰三角和等边三角形 按角分有直角三角形 锐角三角形 钝角三角形等
  • antd的Form表单控制实例的使用

    Form表单的控制实例 一 业务常景 二 使用Form表单的实例来解决 一 业务常景 遇到一种业务场景 即一个简单的Modal框 Form的一个组合 仔细思考了一下 和我们平时直接使用Form表单还是有一定的区别 我们通常是通过给Form表
  • springcloudAlibaba 链路追踪SkyWalking

    一 链路追踪SkyWalking简介 在大型系统的微服务化构建中 一个系统被拆分成了许多模块 这些模块负责不同的功能 组合成系统 最终可以提供丰富的功能 在这种架构中 一次请求往往要涉及到多个服务 互联网应用构建在不同的软件模块集上 这些软
  • 关调度与关中断

    关调度与关中断 关中断与关调度是两种进入临界区的方式 它们有各自的使用环境 最近在研究 ucos III 的源代码时发现 ucos III 中有对临界区的优化 以关调度来代替关中断的方式工作 系统可以在特定的情况下用关调度的方式来替代关中断
  • 数据可视化之Seaborn(1)

    文章目录 什么是Seaborn seaborn提供的一些特点 Seaborn的基本使用 1 安装seaborn 2 导入seaborn库并导入Seaborn内置数据集 3 设置画图空间风格 4 设置子图风格 5 去除图脊 边框 6 设置内容
  • 设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。

    分数 题目内容 设计一个表示分数的类Fraction 这个类用两个int类型的变量分别表示分子和分母 这个类的构造函数是 Fraction int a int b 构造一个a b的分数 这个类要提供以下的功能 double toDouble
  • 第五章:数据库完整性

    数据库完整性 文章目录 5 1参照完整性 5 1 1实体完整性定义 5 1 2实体完整性的违约处理和检查 5 2参照完整性 5 2 1参照完整性定义 5 2 2参照完整性的违约处理和检查 5 3用户自定义的完整性 5 3 1属性上的约束条件