zoukankan      html  css  js  c++  java
  • mysql触发器new old 详解 真实例子

    mysql触发器new old:

    "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧

    的列名属于创建了过渡变量("transition variables")。

    对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及

    OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。

    1. CREATE TRIGGER tr1  
    2. BEFORE UPDATE ON t22   
    3. FOR EACH ROW   
    4. BEGIN   
    5. SET @old = OLD.s1;   
    6. SET @new = NEW.s1;   
    7. END; 

    但其实在触发器中,还要看触发器的时机,如果是插入前动手的,也可以写成set @t_time=NOW();t_time不需要预先定义,也不用NEW,或是OLD,如下我的真实例子:

    begin
    set @t_id= (select max(ID) from P_Booth);
    set @t_name= 'P_Booth';
    set @t_time=NOW();
    INSERT INTO `L_InsertLogs` (`Counts`, `TablesName`,`OperateTime`) VALUES (@t_id,@t_name,@t_time);
       end

    如果是在更新之后要动手的,那需要用NEW来定义, 如下:

    begin
    set @t_id= new.ID;
    set @t_name= 'P_Booth';
    set @t_time=NOW();
    INSERT INTO `L_UpdateLogs` (`Counts`, `TablesName`,`OperateTime`) VALUES (@t_id,@t_name,@t_time);
    end


    如果是在删除之后要动手的,那就需要用OLD来定义了,如下:

    其实这个很有意思,因为ID值其实已经被删除,却还是可以用,实在是有点不太理解数据库删除数据的真正机制。

    begin
    set @t_id= old.ID;
    set @t_name= 'P_Booth';
    set @t_time=NOW();
    INSERT INTO `L_DeleteLogs` (`Counts`, `TablesName`,`OperateTime`) VALUES (@t_id,@t_name,@t_time);
    end

  • 相关阅读:
    c/c++本地时间获取
    c++为什么要面向对象?
    设置c++中cout输出的字体颜色
    c++11并行、并发与多线程编程
    奇怪吸引子---RayleighBenard
    奇怪吸引子---QiChen
    奇怪吸引子---Qi
    奇怪吸引子---NoseHoover
    奇怪吸引子---NewtonLeipnik
    奇怪吸引子---LuChen
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314267.html
Copyright © 2011-2022 走看看