6第六章 SQL中的约束和触发程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Create Table MovieStar( name char(30), ID char(18), address Varchar(255), gender char(1), birthday Date, Primary Key (name), Unique (ID) );
11
参照完整性和外键
If-Then/Case-When/While-Loop/Call/…… 不同的DBMS,有很大的差异
C/S的基础
38
存储过程——原理
Create Procedure
经过预编译,保存在DB的系统表中
语法分析、有效格式 生成查询树
Execute Procedure
编译、执行(依据查询树、统计信息、参数)
存储过程——示例
Create Procedure update_dept (IN old_dept_num INT, IN new_dept_num INT, IN new_dept_name Char(20), IN new_dept_head_id INT) BEGIN ATOMIC Insert Into Department (dept_id,dept_name, dept_head_id) Values (new_dept_num, new_dept_name, new_dept_head_id);
表级
…… Foreign Key sno References student(sno), Foreign Key cno References course(cno), …...
13
参照完整性和外键——声明
14
保持参照完整性
参照完整性的违例 从表
插入从表元组,且外键不为Null 修改从表外键,且不为Null
Update employee Set dept_id = new_dept_num Where dept_id=old_dept_num; Delete From department Where dept_id=old_dept_num; END Execute update_dept 123,212,’cs’,’98001’
域约束
Create Domain GenderDomain char(1) Constraint GenderFM Check(Value in (‘F’, ‘M’))
元组约束
Constraint RightTitle Check(gender = ‘F’ OR name Not Like ‘Ms.%’)
以Value替代属性名
24
全局约束
针对元组/关系的约束声明
基于元组的Check 基于整个关系或多个关系的Check
25
全局约束——元组Check
存在于关系定义中的Check 对关系中的当前元组的约束 不适于多关系、子查询
……
check(gender = ‘F’ OR sname Not Like ‘Ms.%’), check(gender = ‘M’ OR sname Not Like ‘Mr.%’),
5
SQL中的键码
实体完整性
候选码的属性不能取Null、也不能有重复值 反映同一关系中属性与属性之间的ห้องสมุดไป่ตู้束
6
SQL中的键码——声明
Create Table MovieStar( name char(30) Primary Key, address Varchar(255), gender char(1), birthday Date );
……
26
全局约束——断言Assertion
涉及整个关系、多关系的约束 适用涉及子查询、复杂约束 真正的全局约束 独立于关系
27
全局约束——断言Assertion
Assertion的声明
Create Assertion <名称> Check(<表达式>) 表达式中属性的引用必须显式说明
7
SQL中的键码——声明
Create Table MovieStar( name char(30), address Varchar(255), gender char(1), birthday Date, Primary Key(name) );
8
SQL中的键码——声明
Create Table Movie( title char(20), year integer, incolor boolean, studioname char(20), producerC# integer, Primary Key(title,name) );
属性级
…… sno char(10) References student(sno) On Delete Set Null On Update Cascade, …...
表级
…… Foreign Key sno References student(sno) On Delete Set Null On Update Cascade, …...
Check中的子查询 Check中涉及其他属性或关系
23
对属性值的约束——Domain
使Domain包含Check 将Domain作用于属性
Create Domain GenderDomain char(1) Check(Value in (‘F’, ‘M’)) gender GenderDomain,
29
约束的命名
主码约束
…… Constraint pk_stu Primary Key (sno), ……
参照约束
…… Constraint fk_sc_stu Foreign Key (sno) References student, ……
30
约束的更新
对已命名的约束可实施更新操作
Drop / Create 各DBMS的方式有差异
9
SQL中的键码——声明
Create Table MovieStar( name char(30) Primary Key, ID char(18) Unique, address Varchar(255), gender char(1), birthday Date );
10
SQL中的键码——声明
隐含Not Null 隐含允许Null
22
不加约束:
对属性值的约束——Check
在定义属性时约束该属性必须使Check 为 True
sage smallint Check(sage >=15), gender char(1) Check(gender in (‘F’, ‘M’))
Be Careful ! !不合适的情形
34
约束的更新——域
Alter Domain ... Drop/Add …
Create Domain GenderDomain char(1) Constraint GenderFM Check(Value in (‘F’, ‘M’)) Alter Domain GenderDomain Drop Constraint GenderFM; Alter Domain GenderDomain Add Constraint GenderFM Check(Value in (‘F’, ‘M’));
35
约束的更新—— Assertion
Drop Assertion … Create Assertion …
36
存储过程
SQL的形式
交互式 嵌入式 单行SQL语句、非过程性语言、上下文无关
37
存储过程
存储过程 Stored Procedure
是为了完成特定的功能而汇集成一组的SQL 语句集 具有3GL的特点,含有程序控制语句
17
保持参照完整性——策略
SET NULL 对主表的违例操作 从表中相关外键的值均被置为Null(前提 是允许为Null)
18
保持参照完整性——策略
SET DEFAULT 对主表的违例操作 从表中相关外键的值均被置为相应的 Default Value
19
保持参照完整性——策略
第六章 SQL中的约束和触发程序
Constraints and Triggers in SQL
概述
关系数据模型
关系数据结构 关系操作集合 关系完整性约束
是对关系的某种约束条件 防止对数据的意外破坏
2
概述
关系模型的完整性约束
实体完整性 参照完整性 用户定义的完整性
3
概述
20
对属性值的约束
属性约束
not null check( ) with attribute
域约束
check( ) with domain
21
对属性值的约束——Not Null
在定义属性时约束该属性不可取Null sname char(20) not null Primary Key约束:
31
约束的更新——表的约束
Alter Table MovieStar Drop Constraint NameInKey; Alter Table MovieStar Add Constraint NameInKey Primary Key (name)
32
约束的更新——表的约束
有些DBMS可以修改属性约束 Alter Table MovieStar Modify gender Check Null; Alter Table MovieStar Modify gender Check(gender In (‘F’, ‘M’);
参照&被参照、主表&从表、主键&外键 外键的值不允许参照不存在的主键的值 主键与外键的相容
类型 属性名可以不同 外键允许Null
反映实体间存在的约束
12
参照完整性和外键——声明
属性级
…… sno char(10) References student(sno), cno char(10) References course(cno), …...
33
约束的更新——表的约束
Alter Table MovieStar Drop Constraint RightTitle; Alter Table MovieStar Add Constraint RightTitle Check( gender = ‘F’ OR name Not Like ‘Ms.%’);
完整性的要求
数据库中数据的正确性、相容性 DBMS支持对约束的声明
约束的实现
for data
for action (event)
4
使用触发器(触发程序)
SQL中的键码
主码和候选吗
Primary Key Unique
Key & Index
一般在Primary Key上自动加上Index 在Unique上的Index需另行声明
主表
删除主表元组,其已被参照 修改主表主键,其已被参照 Drop Table
15
保持参照完整性——策略
RESTRICT 前述违例的情况均不能操作 这是所有DBMS产品均支持的方式 安全的默认方式
16
保持参照完整性——策略
CASCADE 对主表的违例操作 所有从表中的相关元组被级联删除或更新
确定访问路径 建立查询计划
39
存储过程——示例
Create Procedure ProductType WHEN 'Sweatshirt' THEN (IN product_id INT, SET type = 'Shirt' OUT type CHAR(10)) WHEN 'Baseball Cap' THEN BEGIN SET type = 'Hat' Declare prod_name Char(20); WHEN 'Visor' THEN Select name Into prod_name SET type = 'Hat' From product ELSE Where id = product_id; SET type = 'UNKNOWN' Case prod_name END CASE; When 'Tee Shirt' Then END SET type = 'Shirt' 40
Select-From-Where Check(presC# Not In (Select cert# From Movieexec Where netWorth < 10000000))
28
约束的命名
属性约束
Name char(10) Constraint NameIsKey peimary Key
11
参照完整性和外键
If-Then/Case-When/While-Loop/Call/…… 不同的DBMS,有很大的差异
C/S的基础
38
存储过程——原理
Create Procedure
经过预编译,保存在DB的系统表中
语法分析、有效格式 生成查询树
Execute Procedure
编译、执行(依据查询树、统计信息、参数)
存储过程——示例
Create Procedure update_dept (IN old_dept_num INT, IN new_dept_num INT, IN new_dept_name Char(20), IN new_dept_head_id INT) BEGIN ATOMIC Insert Into Department (dept_id,dept_name, dept_head_id) Values (new_dept_num, new_dept_name, new_dept_head_id);
表级
…… Foreign Key sno References student(sno), Foreign Key cno References course(cno), …...
13
参照完整性和外键——声明
14
保持参照完整性
参照完整性的违例 从表
插入从表元组,且外键不为Null 修改从表外键,且不为Null
Update employee Set dept_id = new_dept_num Where dept_id=old_dept_num; Delete From department Where dept_id=old_dept_num; END Execute update_dept 123,212,’cs’,’98001’
域约束
Create Domain GenderDomain char(1) Constraint GenderFM Check(Value in (‘F’, ‘M’))
元组约束
Constraint RightTitle Check(gender = ‘F’ OR name Not Like ‘Ms.%’)
以Value替代属性名
24
全局约束
针对元组/关系的约束声明
基于元组的Check 基于整个关系或多个关系的Check
25
全局约束——元组Check
存在于关系定义中的Check 对关系中的当前元组的约束 不适于多关系、子查询
……
check(gender = ‘F’ OR sname Not Like ‘Ms.%’), check(gender = ‘M’ OR sname Not Like ‘Mr.%’),
5
SQL中的键码
实体完整性
候选码的属性不能取Null、也不能有重复值 反映同一关系中属性与属性之间的ห้องสมุดไป่ตู้束
6
SQL中的键码——声明
Create Table MovieStar( name char(30) Primary Key, address Varchar(255), gender char(1), birthday Date );
……
26
全局约束——断言Assertion
涉及整个关系、多关系的约束 适用涉及子查询、复杂约束 真正的全局约束 独立于关系
27
全局约束——断言Assertion
Assertion的声明
Create Assertion <名称> Check(<表达式>) 表达式中属性的引用必须显式说明
7
SQL中的键码——声明
Create Table MovieStar( name char(30), address Varchar(255), gender char(1), birthday Date, Primary Key(name) );
8
SQL中的键码——声明
Create Table Movie( title char(20), year integer, incolor boolean, studioname char(20), producerC# integer, Primary Key(title,name) );
属性级
…… sno char(10) References student(sno) On Delete Set Null On Update Cascade, …...
表级
…… Foreign Key sno References student(sno) On Delete Set Null On Update Cascade, …...
Check中的子查询 Check中涉及其他属性或关系
23
对属性值的约束——Domain
使Domain包含Check 将Domain作用于属性
Create Domain GenderDomain char(1) Check(Value in (‘F’, ‘M’)) gender GenderDomain,
29
约束的命名
主码约束
…… Constraint pk_stu Primary Key (sno), ……
参照约束
…… Constraint fk_sc_stu Foreign Key (sno) References student, ……
30
约束的更新
对已命名的约束可实施更新操作
Drop / Create 各DBMS的方式有差异
9
SQL中的键码——声明
Create Table MovieStar( name char(30) Primary Key, ID char(18) Unique, address Varchar(255), gender char(1), birthday Date );
10
SQL中的键码——声明
隐含Not Null 隐含允许Null
22
不加约束:
对属性值的约束——Check
在定义属性时约束该属性必须使Check 为 True
sage smallint Check(sage >=15), gender char(1) Check(gender in (‘F’, ‘M’))
Be Careful ! !不合适的情形
34
约束的更新——域
Alter Domain ... Drop/Add …
Create Domain GenderDomain char(1) Constraint GenderFM Check(Value in (‘F’, ‘M’)) Alter Domain GenderDomain Drop Constraint GenderFM; Alter Domain GenderDomain Add Constraint GenderFM Check(Value in (‘F’, ‘M’));
35
约束的更新—— Assertion
Drop Assertion … Create Assertion …
36
存储过程
SQL的形式
交互式 嵌入式 单行SQL语句、非过程性语言、上下文无关
37
存储过程
存储过程 Stored Procedure
是为了完成特定的功能而汇集成一组的SQL 语句集 具有3GL的特点,含有程序控制语句
17
保持参照完整性——策略
SET NULL 对主表的违例操作 从表中相关外键的值均被置为Null(前提 是允许为Null)
18
保持参照完整性——策略
SET DEFAULT 对主表的违例操作 从表中相关外键的值均被置为相应的 Default Value
19
保持参照完整性——策略
第六章 SQL中的约束和触发程序
Constraints and Triggers in SQL
概述
关系数据模型
关系数据结构 关系操作集合 关系完整性约束
是对关系的某种约束条件 防止对数据的意外破坏
2
概述
关系模型的完整性约束
实体完整性 参照完整性 用户定义的完整性
3
概述
20
对属性值的约束
属性约束
not null check( ) with attribute
域约束
check( ) with domain
21
对属性值的约束——Not Null
在定义属性时约束该属性不可取Null sname char(20) not null Primary Key约束:
31
约束的更新——表的约束
Alter Table MovieStar Drop Constraint NameInKey; Alter Table MovieStar Add Constraint NameInKey Primary Key (name)
32
约束的更新——表的约束
有些DBMS可以修改属性约束 Alter Table MovieStar Modify gender Check Null; Alter Table MovieStar Modify gender Check(gender In (‘F’, ‘M’);
参照&被参照、主表&从表、主键&外键 外键的值不允许参照不存在的主键的值 主键与外键的相容
类型 属性名可以不同 外键允许Null
反映实体间存在的约束
12
参照完整性和外键——声明
属性级
…… sno char(10) References student(sno), cno char(10) References course(cno), …...
33
约束的更新——表的约束
Alter Table MovieStar Drop Constraint RightTitle; Alter Table MovieStar Add Constraint RightTitle Check( gender = ‘F’ OR name Not Like ‘Ms.%’);
完整性的要求
数据库中数据的正确性、相容性 DBMS支持对约束的声明
约束的实现
for data
for action (event)
4
使用触发器(触发程序)
SQL中的键码
主码和候选吗
Primary Key Unique
Key & Index
一般在Primary Key上自动加上Index 在Unique上的Index需另行声明
主表
删除主表元组,其已被参照 修改主表主键,其已被参照 Drop Table
15
保持参照完整性——策略
RESTRICT 前述违例的情况均不能操作 这是所有DBMS产品均支持的方式 安全的默认方式
16
保持参照完整性——策略
CASCADE 对主表的违例操作 所有从表中的相关元组被级联删除或更新
确定访问路径 建立查询计划
39
存储过程——示例
Create Procedure ProductType WHEN 'Sweatshirt' THEN (IN product_id INT, SET type = 'Shirt' OUT type CHAR(10)) WHEN 'Baseball Cap' THEN BEGIN SET type = 'Hat' Declare prod_name Char(20); WHEN 'Visor' THEN Select name Into prod_name SET type = 'Hat' From product ELSE Where id = product_id; SET type = 'UNKNOWN' Case prod_name END CASE; When 'Tee Shirt' Then END SET type = 'Shirt' 40
Select-From-Where Check(presC# Not In (Select cert# From Movieexec Where netWorth < 10000000))
28
约束的命名
属性约束
Name char(10) Constraint NameIsKey peimary Key