一、什么是数据库完整性
数据库的完整性是指数据库中数据的正确性和相容性。
数据库完整性由各种完整性约束来保证。而完整性约束既可以通过DBMS来保障,也可以通过应用程序来实现。如果是基于DBMS,完整性约束将作为关系模式的一部分存入数据库,也就是说,直接在数据库进行定义。
二、完整性的保护措施
1、约束条件
对数据库中数据设置一些约束条件,作完整性检查。完整性约束条件的作用对象可以是关系(即表)、元组(即行)、属性(即字段、列)。约束在表中定义,运行时检查,发现条件不满足即通知用户,以便采取措施。
数据库约束分为静态约束和动态约束。
1)静态约束
数据库中数据的语法、语义限制与数据之间的逻辑约束称为静态约束。静态约束反映了数据及其之间的固有逻辑特性,是最重要的一类完整性约束。
静态约束包括:
(1)静态属性级约束
数据类型的约束
数据格式的约束
取值范围或取值集合的约束
空值的约束
其他约束
(2)静态元组约束
静态元组约束就是规定组成一个元组的各个列之间的约束关系,静态元组约束只局限在单个元组上。(空口无凭)
(3)静态关系约束
【实体完整性约束】
要求主键中的任一属性都不能为空
【参照完整性约束】
地球人都知道,主外键。它们所在的元组删除时,有
级联删除:一起删除
受限删除:不能删除,除非先将外键所在元组删除
置空删除:主键元组删除,外键元组的外键置空
除了删除,还有插入:
受限插入:存在对应的主键时,外键所在元组才被插入
递归插入:先插入主键元组,再插入外键元组
【函数依赖约束】:不清楚是什么鬼
【统计约束】:不清楚是什么鬼
2)动态约束
数据库中的数据变化应遵守的规则称为数据动态约束,它反映了数据库状态变迁的约束。包括
(1)动态属性级约束
修改属性定义时的约束,修改属性值时的约束
(2)动态元组
修改某个元组的值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。
(3)动态关系约束
加在关系变化前后状态上的限制条件,例如事务一致性、原子性等约束条件。
2、触发器
触发器在功能上比约束要强得多。一般来说,违反约束条件时,约束仅给出必要提示,而触发器不仅起到提示,还可以触发系统自动进行某些操作。触发器分为事前触发和事后触发。
触发器除了完整性保护功能外,还有安全性保护功能。
3、应用程序
用代码来实现,不必多言。好处是想怎么写就怎么写,灵活得很,数据库也没有太多约束,简单。简单的往往就是最好的。但是,我们自己写代码,往往达不到好的效果。比如,数值的唯一性。代码在往数据库插入记录的时候,可以拿现有最大值,然后加1。但在并发的情况下,其实不可靠。数据库的唯一索引才能保证不出问题。
参考资料
《数据库系统概论》 数据库完整性