数据库系统原理与实践 笔记 #5
墨初 知识笔记 59阅读
eate trigger语句创建触发器具体语法格式为
create trigger trigger_name trigger_time trigger_eventon tbl_name for each row trigger_stmt;
trigger_name: 触发器的名称如果要在某个特定数据库中创建名称前面应该加上数据库的名称trigger_time是触发器被触发的时间它可以是before或者after以知名触发器是在激活它的语句之前或之后触发。如果希望验证新数据是否满足使用的限制可以使用before如果希望在激活触发器的语句执行之后完成几个或更多的改变可以用after。trigger_event指明了激活触发器的语句的类型tbl_name与触发器相关联的表名必须是永久性表不能将处罚程序与temporary表或视图滚连起来。在表上出发时间发生时才会激活触发器同一个表不能拥有两个具有相同触发时刻和事件的触发器。for each row用来指定对于受才触发事件影响的每一行都要激活触发器的动作trigger_stmt当触发程序激活时执行的语句如果你打算执行多个语句可使用begin…end符合语句结构。 使用触发器 创建并使用触发器实现检查约束保证课程的人数上限up_limit字段值在(60,150,230)范围内 delimiter $$create trigger course_insert before_trigger before inserton course for each rowbeginif (new.up_limit 60 || new.up_limit 150 || new.up_limit 230) thenset new.up_limitnew.up_limit;else insert into mytable values(0);end if;end;$$delimiter;
使用old(旧值)和new(新值)关键字能够访问受触发程序影响的行中的字段值在insert触发程序中仅能使用new.col_name没有旧值在delete触发程序中仅能使用old.col_name没有新值在update触发程序中可以使用old.col_nae来引用更新前的旧值也能使用new.col_name来引用更新后的行中的新值old列是只读的可以引用它但不能更改它在前例之上创建course_update_before_trigger触发器负责进行修改检查 delimiter $$create trigger course_update_before_trigger before updateon course for each rowbeginif (new.up_limit ! 60 || new.up_limit ! 150 || new.up_limit ! 230) thenset new.up_limitold.up_limit;end if;end;$$delimiter;
查看触发器 使用show triggers;命令查看触发器的定义使用show trigger \G命令可以查看当前数据库中所有触发器的信息还可以使用show trigger like 模式\G命令查看与模式模糊匹配的触发器信息。通过查询information_schema数据库中的triggers表可以查看触发器的定义 select * from information_schema.triggers \G;
show create trigger命令可以查看某一个触发器的定义成功创建触发器之后MySQL会自动在数据库目标下创建TRN以及TRG触发器文件可以用记事本打开文件查看定义 删除触发器 与其他数据库对象一样可以使用drop语句将触发器从数据库中删除 drop trigger [schema_name.]trigger_name;
schema_name可选项用于指定触发器所在的数据库的名称如果没有指定则为当前默认数据库trigger_name要删除的触发器名称drop trigger语句需要super权限当删除一个表的同时也会自动删除表上的触发器。另外触发器不能更新或者覆盖为了修改一个触发器必须先删除它然后再重新创建。 关系代数 关系代数 所有的过程化查询语言都提供了一组关系运算这些运算施加于单个关系上或者一对关系上运算结果总是单个关系总共有6个基本关系运算选择 σ \sigma σ、投影 ∏ \prod ∏、集合并 ∪ \cup ∪、集合差-、笛卡尔积 × \times ×、更名 ρ \rho ρ 选择运算 作用选择满足给定谓词条件的元组符号表示形式 σ p ( r ) \sigma_p(r) σp(r)p是选择谓词形式化定义 σ p ( r ) { t ∣ t ∈ r ∧ p ( t ) } \sigma_p(r)\{t|t\in r\land p(t)\} σp(r){t∣t∈r∧p(t)} 投影运算 作用过滤掉特定的属性符号表示形式 ∏ A 1 , A 2 , . . . , A m ( r ) \prod_{A_1,A_2,...,A_m}(r) ∏A1,A2,...,Am(r)其中 A 1 , A 2 , . . . , A m A_1, A_2, ..., A_m A1,A2,...,Am是属性名r是关系名操作结果是通过去除未列出的列获得的一个m列的关系形式化定义 笛卡尔积运算 作用结合来自任意两个关系的信息符号表示r × \times ×s形式化定义 r × s { < t , q > ∣ t ∈ r ∧ q ∈ s } r\times s \{<t,q>|t\in r \land q\in s\} r×s{<t,q>∣t∈r∧q∈s} 连接运算 作用可以将选择运算和笛卡尔积运算合并为一个运算操作连接两个表的信息符号表示 r ⋈ s σ θ ( r × s ) r \bowtie s \sigma_\theta(r\times s) r⋈sσθ(r×s) θ \theta θ是 R ∪ S R\cup S R∪S模式属性上的一个选择谓词 集合并运算 符号表示 r ∪ s r\cup s r∪s形式化定义 r ∪ s { t ∣ t ∈ r ∨ t ∈ s } r\cup s \{t|t\in r\lor t\in s\} r∪s{t∣t∈r∨t∈s}要使 r ∪ s r\cup s r∪s有意义我们要求以下两个条件必须同时成立 关系r和s必须同元即它们的属性数目必须相同属性域必须相同 集合差运算 符号表示 r − s r - s r−s形式化定义 r − s { t ∣ t ∈ r ∧ t ∉ s } r-s \{t|t\in r\land t\notin s\} r−s{t∣t∈r∧t∈/s}要使 r ∪ s r\cup s r∪s有意义我们要求以下两个条件必须同时成立 关系r和s必须同元即它们的属性数目必须相同r和s的属性域必须相同 更名运算 通过更名运算可以用一个新的名称来指代一个关系例如 ρ x ( E ) \rho_x(E) ρx(E)返回表达式E的结果并把名字x赋给它假设关系代数表达式E是多元的则表达式ρ x ( A 1 , A 2 , . . . , A n ) ( E ) \rho_{x(A_1,A_2,...,A_n)}(E) ρx(A1,A2,...,An)(E)返回表达式E的结果并赋给它名字x同时将各属性命名为 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1,A2,...,An 基本关系代数总结 关系代数中基本的表达式是如下二者之一 数据库中的一个关系一个常数关系 集合交运算 符号表示 r ∩ s r\cap s r∩s形式化定义 r ∩ s { t ∣ t ∈ r ∧ t ∈ s } r\cap s \{t|t\in r\land t\in s\} r∩s{t∣t∈r∧t∈s}要使 r ∪ s r\cup s r∪s有意义我们要求以下两个条件必须同时成立 关系r和s必须同元即它们的属性数目必须相同属性域必须相同 自然连接运算 已知关系 r ( R ) r(R) r(R)和 s ( S ) s(S) s(S)那么 r ⋈ s r\bowtie s r⋈s是在 R ∪ S R\cup S R∪S模式下获得的关系具体如下 依次比较关系r的元组 t r t_r tr和关系s的元组 t s t_s ts如果在 R ∩ S R\cap S R∩S模式下元组 t r t_r tr和 t s t_s ts 赋值运算 赋值操作( ← \leftarrow ←)可以使复杂查询的表达变得简单即将查询表达为一个顺序程序包括一系列的复制一个值被作为查询结果显示的表达式 删除 只可以删除整个元组而无法删除特定的属性值关系代数表达式 r ← r − E r\leftarrow r-E r←r−E其中r是关系E是一个关系代数查询

标签: