mysql触发器

  

这两天写项目,有个要求是记录用户登录登出操作,把这些操作写到日志表里去,我觉得这个功能用MySQL的触发器来写,更方便一些,所以在这整理了一下这一过程。

在这里,我就不把项目的所以代码都粘贴过来了,项目用的是hibernate,这里我创建两个简单的表来演示一下这个过程。

1:登录表,记录用户的账号,密码以及在线状态,0表示不在线,1表示在线。对status进行默认约束,默认值就是0.

create table login(
    id int not null primary key auto_increment,
    password varchar(20) not null,
    status int not null default 0
)

看一下表结构:

2:日志表,记录执行操作的时间和执行了什么操作,这里我写的更简单,时间和用户ID

create table log(
    id int not null primary key auto_increment,
    operationTime timestamp,
    login_id int
);

可以看出,这里的日期时间类型,我用的是timestamp,这个类型可以自动生成你进行相应记录操作的时间,当然,你可以更改具体的操作,比如说,在Insert的时候才自动生成,或者只有在delete的时候自动生成。log表的信息只有插入和查询,是不会更新的。所以涉及不到timestamp的其他内容。

3:触发器:我们的触发器要实现的功能是  在修改表login的status记录的时候,向log表插入一条数据,记录当前时间和用户。

delimiter $
create trigger status
after update on login
for each row
begin
    if
        old.status<>new.status
    then
        insert into log(login_id) values(new.id);
    end if;
end 

 1)delimiter $ 的意思是告诉告诉MySQL解释器,用哪个符号作为结尾。通常用的都是; 一到分号就开始执行MySQL语句了,用了delimiter $就说明在遇到$的时候执行。

 2)触发器trigger语法 

    create trigger triggerName

    after/before  insert/update/delete  on  表名

    for each row  (这句话在MySQL是固定的)

    begin

      sql语句;

    end;

 3)after/before

    这个是触发程序的时间,是在后面的操作执行之前 还是执行之后,当然 这里说的执行是正确执行。

 4)insert/update/delete

    这个是指明激发触发器的事件类型,是对表进行了插入 更新 或者是删除操作 ,才能触发这个程序。显然上面的程序是针对更新操作而言的。

 5)old new

    old.列名指的是原来的值   new.列名指的是新的值。我们把new.id赋值给了log表的Login_id。

 6)if   then   end if

    这是个程序块,在begin end之间可以写简单的sql语句 也可以写程序块。这也是为什么要delimiter $的原因,如果还是默认的; MySQL解释器读到这的时候就开始执行了,显然这是错误的。

4:执行效果

  创建触发器

    

  向login表中插入数据,别忘了把;改回来

    

    

  查了一下log表 是没有记录的。

    

  对表login执行update操作

    

  再查看log表 是有结果的。而且timestamp自动更新了当前时间。

    

5:写个插入的触发器试试看,刚才的是update,我们插入之后log表是没有记录的,现在再写一个触发器。

  

delimiter $
create trigger insertLogin
after insert on login
for each row
begin
    insert into log(login_id) values(new.id);
end
insert into login values(default,‘14785‘,0);

    

时间: 2024-10-26 10:47:31

mysql触发器的相关文章

mysql触发器学习

创建一个触发器 语法: create trigger 触发器名字 create trigger xiaoshou_update_trigger  after update on xiaoshou  for each row  begin  update jiangjin  set xiaoshouer=( select sum(taoshu*danjia)from xiaoshou  where userid=new.userid  and month=new.month) , jiangjin

mysql 触发器基础:

触发器,顾名思义,基于某具体的DML语句的触发或执行,来执行一个动作.mysql触发器在6个不同的集成点进行定义:before insert:插入之前执行触发器 after insert:插入之后执行触发器before update:插入之前执行触发器after update:插入之后执行触发器before delete:删除之前执行触发器 after delete:删除之后执行触发器 每个点只能定义一个触发器,触发器只可以应用在for each row上,没有每个语句级的功能.也没有代替触发器

mysql触发器的实战经验-不错的文章

1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程序比如fc-star管理端,sfrd(das),dorado都会用到触发器程序,实现对于数据库增.删.改引起事件的关联操作.本文介绍了触发器的类型和基本使用方法,讲述了触发器使用中容易产生的误区,从mysql源码中得到触发器执行顺序的结论,本文最后是实战遭遇的触发器经典案例.没有特殊说明时,本文的实

8Python全栈之路系列之MySQL触发器

Python全栈之路系列之MySQL触发器 l 对某个表进行增/删/改操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行增/删/改前后的行为. 创建触发器基本语法 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN     ... END 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON t

MySQL触发器分析

触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有以下的作用: 1.安全性.可以基于数据库的值使用户具有操作数据库的某种权利. # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据. # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%. 2.审计.可以跟踪用户对数据库的操作. # 审计用户操作数据库的语句. # 把用户对数据库的更新写入审计表. 3.实

MySQL触发器的正确用法

一.创建触发器的基本语法: CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 触发器语句 触发事件包括:INSERT.UPDATE.DELETE 二.正确案例演示 如果想在sql文件中直接创建触发器,下面为一个完整的sql文件创建(含触发器的创建)示例: use mysql drop database if exists myTest; create database myTest default charset=gb2312; u

mysql 触发器 Varnish:高速http缓存 varnish cdn 推送平台

sendfile(数据直接从 kernal的buffer出去)适合小文件Aio(nginx)全异步(与事件驱动io的区别是:数据会到达mem才会通知,其实也不需要通知 可以直接返回给客户端) 支持:mmap event drive(处理大文件) 上一回说到,在数据库修改后,redis里面的数据不能做到自动更新,必须手动删除更改过的数据 根据以上问题我们做出如下改进:所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中配置 gearman 实现数据同步Gearman 是一个支持

MySQL 触发器 语法实例

MySQL触发器语法: DELIMITER // create trigger [trigger_name] [before/after] [insert/delete/update] on [table_name] for each row begin --doing something like this insert into tab2(tab2_id) values (new.tab1_id); end;// DELIMITER; 测试通过

mysql触发器的作用及语法

触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有操作数据库的某种权利. # 能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据. # 能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%. 2.审计.能够跟踪用户对数据库的操作. # 审计用户操作数据库的语句. # 把用户对数据库的更新写入审计表. 3.实

实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+php.worker

上回一次我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis 中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情 况. 详情请见        基于redis缓存数据库实现lnmp架构高速访问 所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中. 因为mysql和redis数据格式不同,不能实现直接同步,所以 将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP