220 likes | 402 Views
10. 数据库完整性. 数据库是否具备完整性关系到数据库系统能否真实地反映现实世界。完整性措施地防范对象是不合语义的数据存入数据库中。 例: 以上两个表的数据库是否完整?. 10.1 完整性约束条件. 完整性约束条件分类. 对象状态. 动态列级约束. 动态元组约束. 动态关系约束. 动态. ⑷. ⑸. ⑹. 静态. ⑴. ⑵. ⑶. 静态列级约束. 静态元组约束. 静态关系约束. 对象粒度. 列. 元组. 关系. 10.1 完整性约束条件. 静态列级约束(最常用的约束) 对数据类型的约束
E N D
《数据库系统概论》讲义 10. 数据库完整性 • 数据库是否具备完整性关系到数据库系统能否真实地反映现实世界。完整性措施地防范对象是不合语义的数据存入数据库中。 • 例: • 以上两个表的数据库是否完整?
《数据库系统概论》讲义 10.1 完整性约束条件 • 完整性约束条件分类 对象状态 动态列级约束 动态元组约束 动态关系约束 动态 ⑷ ⑸ ⑹ 静态 ⑴ ⑵ ⑶ 静态列级约束 静态元组约束 静态关系约束 对象粒度 列 元组 关系
《数据库系统概论》讲义 10.1 完整性约束条件 • 静态列级约束(最常用的约束) • 对数据类型的约束 • 数据类型(字符型、数值型、日期型、布尔型) • 长度(不同DBMS对某一类型的长度约束不同) • 单位(数据库中同一列上的数据的单位应当一致) • 精度(长整型、短整型、单精度型、双精度型) • 对数据格式约束 • 日期格式(YY.MM.DD、MM.DD.YY) • 编码格式(学号:022704、郭项亮,课程号:315.22507、数据库技术) • 对取值范围或取值集合的约束 • 年龄(14-100)、性别(男或女)
《数据库系统概论》讲义 10.1 完整性约束条件 • 静态列级约束(最常用的约束) • 对空值的约束 • 允许还是不允许在某一字段上取空值; • 其他约束 • 该列上的值唯一 • 例:create table student (sno char(5) not null like “02%”, sname char(8) not null, sbirth date, ssex char(2) check(ssex=‘男’ or ssex=‘女’ ))
《数据库系统概论》讲义 10.1 完整性约束条件 • 静态元组约束 • 规定元组各个列之间的约束关系 • 可在表级约束中进行 • 例:create table student (sno char(5) not null like “02%”, sname char(8) not null, sbirth date, ssex char(2) check(ssex=‘男’ or ssex=‘女’ ), gkkm1cj int,gkkm2cj int, gkkm3cj int,gkkm4cj int, check (gkkm1cj+gkkm2cj+gkkm3cj+gkkm4cj>=500) )
《数据库系统概论》讲义 10.1 完整性约束条件 • 静态关系约束 • 实体完整性 • 定义主键 • 主键上的值非空且唯一 • 参照完整性 • 定义外键 • 外键要参照其他表(参照的表名和列名) • 函数依赖约束 • 哪些数据项归结为一张表 • 统计约束 • 某些字段的统计关系
《数据库系统概论》讲义 10.1 完整性约束条件 • 静态关系约束 • 例:create table student (sno char(5) not null like “02%” , sname char(8) not null, sbirth date, ssex char(2) check(ssex=‘男’ or ssex=‘女’ ), gkkm1cj int,gkkm2cj int,gkkm3cj int,gkkm4cj int, sdeptno char(2), primary key (sno), foreign key (sdeptno) references depts(deptno), check (gkkm1cj+gkkm2cj+gkkm3cj+gkkm4cj>=500) )
《数据库系统概论》讲义 10.1 完整性约束条件 • 动态列级约束 • 修改列定义时的约束 • 修改某一列的类型时的处理规则(字符型修改为数值型的转换) • 修改某一列的约束时的处理规则(允许空值修改为不允许空值,空值的转换规则) • 修改列值时的约束 • 修改列值时需要参照其旧值,新旧值之间满足某种关系 • 动态列级约束系统支持程度有限,要靠编写程序来维护。 • 编写导入导出程序进行 • 靠触发器完成
《数据库系统概论》讲义 10.1 完整性约束条件 • 动态元组约束 • 修改元组值时的约束 • 修改元组值时需要参照其旧值,新旧值之间满足某种关系 • 动态元组约束系统支持程度有限,要靠编写程序来维护。 • 编写导入导出程序进行 • 靠触发器完成
《数据库系统概论》讲义 10.1 完整性约束条件 • 动态关系约束 • 关系变化前后的约束 • 修改某关系或关系集合要符合业务的一致 • 动态关系约束要靠事务机制来维护。 • 事务 • 并发 • 恢复
《数据库系统概论》讲义 10.2 完整性控制 • DBMS的完整性控制机制具有三个方面功能 • 定义功能 • 由create table时定义 • 由触发器定义 • 由事务定义 • 检查功能 • 立即执行约束(create table、触发器) • 延迟执行约束(事务) • 动作功能 • 拒绝执行(create table、事务回退) • 自定义动作(触发器)
《数据库系统概论》讲义 10.2 完整性控制 • 一条完整性规则的五个方面 • D(Data):约束作用的数据对象; • O(Operation):触发完整性检查,立即检查还是延迟检查; • A(Assertion):必须满足的断言或语义约束,这是规则的主体; • C(Condition):选择A作用的数据对象值的谓词; • P(Procedure):违反完整性规则触发的过程。
《数据库系统概论》讲义 10.2 完整性控制 • 例:学号不能空约束 • D:约束作用的数据对象为sno; • O:立即检查还是延迟检查,插入或修改student 元组时; • A:sno 不能空; • C:作用于所有元组上,没有对象值的谓词; • P:违反完整性规则触发的过程,拒绝执行。 • 例:教授工资不低于1000元约束 • D:约束作用的数据对象为sal; • O:插入或修改职工 元组时; • A:sal >=1000; • C:职称=“教授”; • P:违反完整性规则触发的过程,拒绝执行。
《数据库系统概论》讲义 10.2 完整性控制 • 关系系统中的三类完整性 • 实体完整性 • 参照完整性 • 用户自定义完整性 关于参照完整性可以继续探讨
《数据库系统概论》讲义 10.2 完整性控制 • 实现参照完整性的几个问题 • 外码能否接受空值(某些情况下,外码取空值能对应实际语义,如学生的系别取空值表示没有分配系); • 被参照关系中删除元组时的问题 • 级联删除(cascades) • 受限删除(restricted) • 置空值删除(nullifies) • 被参照关系中修改元组时的问题 • 级联修改 • 拒绝修改 • 置空值修改
《数据库系统概论》讲义 10.2 完整性控制 • 实现参照完整性的几个问题 • 在参照关系中插入元组时的问题 • 受限插入 • 递归插入 • 在参照关系中修改元组时的问题 • 受限修改 • 递归插入 • 修改关系中主码 • 不允许修改主码 • 允许修改主码
《数据库系统概论》讲义 10.2 完整性控制 • CREATE TABLE [schema.]tablename (colname dadatype [DEFAULT 值|NULL] [列级约束|表级约束][,colname…]); 列级约束:NOT NULL 或[CONSTRAINT 约束名] UNIQUE|PRIMARY KEY|CHECK(条件) |REFRENCES 表[(col,…)][ON DELETE CASCADE]] 表级约束:[CONSTRAINT 约束名] UNIQUE(col,col…) |PRAMARY KEY (col,col…)|CHECK(条件) |FOREIGN KEY (col,col…) REFRENCES 表 [(col,…)] [ON DELETE CASCADE]
《数据库系统概论》讲义 10.3 触发器和存储过程 • 非过程的SQL不具备计算的完整性。ORACLE引入PL/SQL,INFORMIX引入SPL,SQLSERVER引入T-SQL.过程SQL支持内存驻留变量、条件和循环结构、过程和函数等。 • 一个用过程SQL编写的函数在服务器上执行时被称为存储过程,由Create Function语句记录在服务器上的数据库目录表中。 • 触发器是可以在任意事件发生时执行的过程性SQL语句块。触发器用于实现定制的约束或缺省行为。 • 用户定义函数(UDF)是用过程性SQL(或C、Java)写的函数,可以像交互式SQL中的内部函数一样被调用。
《数据库系统概论》讲义 10.3 触发器和存储过程 • 触发器类似于过程和函数,是一个程序块,但过程是被显式调用,而触发器是当事件发生时,被自动调用(触发),且触发器不接受参数。 • 触发器能引起一个动作的执行,它可以用来实现过程性约束.建表时创建的约束称为非过程性约束。 • Sybase数据库最早支持触发器,现在Oracle、DB2 UDB、Informix、SQL Server都支持,但Core SQL-99不支持。 • 定义触发器动作时,各个产品用自己的过程性语言。Oracle使用pl/sql、c、java,DB2使用c、java。
《数据库系统概论》讲义 10.3 触发器和存储过程 • 例:create or replace trgger t_c after update on coustomers for each row when (new.discnt>15.0) declare v1 number; v2 number; begin v1 :=:old.discnt; v2 :=:new.discnt; dbms_output.put_line(‘old:’||to_char(v1) ||’new:’||to_char(v2)); end; 说明:对表coustomers的修改操作发生后,把折扣率大于15的旧折扣率和新折扣率列出.
《数据库系统概论》讲义 10.作业 • P-313 • 3. • 4. • 5. • 6.