当前位置:首页 > 编程教程 > mysql技术文章 > MySQL 触发器的基础操作(六)

MySQL 触发器的基本使用

  • 发布时间:
  • 作者:码农之家
  • 点击:180

这篇文章主要知识点是关于mysql、触发器、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

MySQL王者晋级之路
MySQL王者晋级之路高质量扫描版
  • 类型:MySQL数据库大小:76.5 MB格式:PDF作者:张甦
立即下载

MySQL 触发器的基础操作(六)

1.为什么使用触发器: 

    在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构,而数据库对象触发器则用来实现由一些表事件触发的某个操作。在数据库系统中,当执行表事件时,则会激活触发器,从而执行器包含的操作。触发器的操作包含创建、查看、删除。 

    触发器是数据库对象之一,该对象与编程语言 中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行。例如:在学生表中有学生名字、学生总数字段,每当添加一条学生记录时,学生的总数就必须同时改变。对于这个实例可以创建一个触发器,每次添加一条学生记录时,就执行一次计算学生总数的操作,这样就可保证每次添加一条学生记录后,学生总数和学生记录数一致。MySQL中在触发如下DELETE、INSERT、UPDATE语句时,就会自动执行所设置的操作,其他SQL语句则不会激活触发器。之所以会经常使用触发器,是因为该对象能够加强数据库表中数据的完整性约束和业务规则等。

2.创建触发器: 
    按照激活触发器时所执行的语句条目,可以将触发器分为“一个执行语句的触发器”和“多个执行语句的触发器” 

2.1 创建有一条执行语句的触发器:

语法形式为:

create trigger trigger_name 
  before | after trigger_event
    on table_name for each row trigger_stmt

//trigger_name 参数表示索要创建的触发器的名字,触发器的名字不能重复。建议触发器的命名为trigger_xxx或者tri_xxx;
before和after参数指定了触发器执行的时间,before:指在触发器事件之前执行触发器语句,after:指在触发器事件之后执行触发器语句;
trigger_event表示触发事件,即触发器执行条件,包delete、insert、update语句;table_name触发事件操作表的名字;
for each row表示任何一条记录上的操作满足触发事件都会触发该触发器;trigger_stmt表示激活触发器后被执行的语句。

示例:

create trigger tri_diaryteim 
  before insert on t_dept for each row
    insert into t_diary values(null,'t_dept',now());
//功能说明:向部门表插入一条记录之前向表t_diary插入当前时间记录。

2.2 创建包含多条执行语句的触发器:

语法形式如下:

create trigger trigger_name
  before|after trigger_event
    on table_name for each row
      begin
      trigger_stmt
      end

//比“只有一条执行语句的触发器”语法多了两个关键字begin和end,在这两个关键字之间是所要执行的多个执行语句的内容,执行语句之间用分号隔开。
在mysql中,一般情况下“;”符号作为语句的结束符号,可是在创建触发器时,需要用到“;”符号作为执行语句的结束符号。
为了解决该问题,可以使用关键字DELIMITER语句,例如:"DELIMITER$$",可以用来将结束符号设置为“$$”.

示例:

DELIMITER $$
create trigger tri_diarytime2
 after insert 
 on t_dept for each row
  begin 
  insert into t_diary values(null,'t_dept',now());
  insert into t_diary values(null,'t_dept',now());
  end
  $$
    DELIMITER;

3.查看触发器: 

3.1 通过SHOW TRIGGERS语句查看触发器:

语法为:
show triggers \G

3.2 通过查看系统表triggers实现查看触发器:

操作语句为;

use information_schema;
select * from triggers \G
select * from triggers where trigger_name='tri_diarytime2' \G //查看指定触发器

3.删除触发器:

语法为:
drop trigger trigger_name;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

MySQL 相关电子书
学习笔记
网友NO.468124

mysql 触发器用法实例详解

MySQL触发器语法详解: 触发器 trigger是一种特殊的存储过程,他在插入(inset)、删除(delete)或修改(update)特定表中的数据时触发执行,它比数据本身标准的功能更精细和更复杂的数据控制能力 。触发器不是由程序调用,而是由某个事件来触发的。在有数据修改时自动强制执行其业务规则,经常用于加强数据的完整性约束和业务规则等。触发器可以查询其他表,而且包含复制的sql语句。触发器也可用于强制引用完整性。触发器可以强制比用check约束定义的约束更为复杂的约束。 (一).CREATE TRIGGER语法 CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt; 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。 触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起……

网友NO.323632

MySQL触发器运用于迁移和同步数据的实例教程

1.迁移数据 进行数据库移植,SQL Server=MySQL。SQL Server上有如下的Trigger SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ALTER TRIGGER [trg_risks] ON dbo.projectrisk FOR INSERT, UPDATE AS BEGIN UPDATE projectrisk SET classification = case when calc= 9 then 3 when calc 9 and calc=4 then 2 when calc 4 then 1 end from (select inserted.id, inserted.possibility*inserted.severity as calc from inserted) as T1 where projectrisk.id = T1.id END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 简单了解了下MySQL中,Trigger的语法。 # 创建 CREATE TRIGGER 触发器名称 { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON 表名称 FOR EACH ROW 触发器SQL语句 # 删除 DROP TRIGGER 触发器名称 注:创建触发器需要CREATE TRIGGER权限。(HeidiSQL中执行Trigger语句会有bug) 由于MySQL中的每个触发器只能针对一个动作,所以本次移植就需要创建两个触发器。对于发生变更的行,在触发器中可以用 NEW 来代替……

网友NO.153563

MySQL通过触发器解决数据库中表的行数限制详解及实例

MySQL通过触发器解决数据库中表的行数限制详解及实例 最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万。 当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL: delimiter $create trigger limitLogbeforeinserton OperationLogfor each rowbeginif (select count(*) from OperationLog) 100000 thendelete from OperationLog limit 1;end if;end $delimiter ; 看起来似乎没什么问题,对于insert前执行判断,如果数量超过100000就执行删除。但在真正数据库超过100000条,也就是开始执行IF语句的时候就出问题,MySQL报错: ERROR 1442 (HY000): Can't update table 'OperationLog' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 查阅资料才知道,MySQL为了防止触发器递归死循环的执行,不允许在某张表的触发器中……

网友NO.910652

MySQL触发器 Update触发Insert失败

今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 --建立测试表CREATE TABLE `triggletest_triggle` (`id` INT(11) NOT NULL,`name` VARCHAR(5) NULL DEFAULT NULL,PRIMARY KEY (`id`))COLLATE='latin1_swedish_ci'ENGINE=InnoDB --建立目标表CREATE TABLE `triggletest` (`seq` INT(11) NOT NULL,`id` INT(11) NOT NULL,`name` VARCHAR(5) NULL DEFAULT NULL,PRIMARY KEY (`seq`),INDEX `id` (`id`))COLLATE='latin1_swedish_ci'ENGINE=InnoDB; ---写入测试数据INSERT INTO `triggletest_triggle` VALUES(1,'A'); --建立触发器DROP TRIGGER if EXISTS test1CREATE TRIGGER test1 AFTER UPDATE ON triggletest_triggleFOR EACH ROWBEGININSERT INTO triggletest(id) values (new.id);END 执行触发器语句,报错,报错内容如下: /* SQL错误(1064):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right s……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com