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的例子。
- CREATE TRIGGER tr1
- BEFORE UPDATE ON t22
- FOR EACH ROW
- BEGIN
- SET @old = OLD.s1;
- SET @new = NEW.s1;
- 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