1. 程式人生 > >mysql觸發器new old 詳解 真例項子

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