標籤:blog 使用 for 問題 ar 代碼 div new
觸發器
情境:
日誌系統,記錄對學生表有哪些操作!
解決的問題:
1, 得到每條學生記錄被修改的時機,才能發出記錄日誌的動作!
2, 執行某段操作,需要得到當前處理的記錄的資訊!
觸發器:一種編程設計!類似js的基於事件編程的程式設計的理念!可以在某個表的每條記錄上,設定一個事件,從而對該表上的某些操作,加以監聽!一旦所監聽的行為出現,則會執行相應的代碼。
記錄 =button
(修改,刪除,增加) =click
執行操作 =alert(‘Hello’);
以上的所有行為,都是採用 sql 完成的:
文法
create trigger 觸發器名字 觸發條件,監聽的內容,觸發後執行的操作
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
其中,觸發條件,事件。是由 事件的時機,與事件的內容 組成
時機:之前before,和之後after!
內容:增加insert,刪除delete,修改update
因此,一共只有六種事件:
before insert before delete before update
after insert after delete after update
監聽的主體是由表中的記錄發出的
on table_name for each row
執行的操作,就是一段 sql的集合!
create trigger test_trigger after insert -- 事件on select_student for each row -- 哪個表的記錄在監聽insert into student_log values (null, ‘insert‘, now(), ‘new ID‘) -- 執行的sql集合;
建立日誌表
create table student_log (id int primary key auto_increment,op varchar(10),op_time datetime,ps varchar(255));
執行插入:
insert into select_student values (null, ‘歐陽鋒‘, ‘male‘, 22, 1234.56, 178.00);
刪除觸發器
drop trigger 觸發器名字
在觸發程式中得到當前觸發的記錄資訊
有,兩個!
new(新的),old(舊的)
new,和old,都表示觸發程式的記錄!
new:新的記錄。old:舊的記錄!
取決於當前操作(intser,update,delete)去使用其中某個:
insert,增加記錄,沒有舊記錄,只有new關鍵字可以使用
delete,刪除記錄,沒有新紀錄,只有old可用!
update,更新,既有新紀錄,也有舊記錄,更新前是舊記錄,而更新後是新紀錄!因此可以 new和 old
記錄,當前學生被刪除之後,記錄日誌,要求記錄學生的id。
create trigger log_del_stu after deleteon select_student for each rowinsert into student_log values (null, ‘delete‘, now(), old.id) -- 執行的sql集合;
測試,刪除記錄:
create trigger log_upd_stu after updateon select_student for each row判斷學生的身高是否大於175記錄日誌;
此時,留意一下 觸發器,與具體的文法的執行時機:
當:insert into table操作!
判斷,是否有before insert 觸發器!有則執行觸發程式!
真正執行 insert into
判斷,是否有after insert 觸發器!有則執行觸發程式!
更新日誌:
記錄更新日誌,要求是,只對某部分同學完成更新日誌!
只記錄,身高超過175學生的更新記錄!記錄學生id和修改前的身高與之後的身高
需要額外的增加條件判斷!
邏輯分支語句:
if 條件 then
語句體
else if 條件 then
語句體
….
else
語句體
end if;
sql語句的結束符問題
可以修改 最外層的語句結束符達到目的!
delimiter $$
將語句結束修改成 $$
記住用完後要再修改回來!
delimiter $$create trigger log_upd_stu after updateon select_student for each rowbeginif old.height > 175 theninsert into student_log values (null, ‘update‘, now(), concat(old.id, ‘:‘, old.height, ‘---‘, new.height));end if;end$$delimiter ;
如果 觸發程式由多條語句組成塊。此時就需要使用
begin
end 將語句塊包裹!
注意,關於觸發器:
1, 一個表上的一個事件只能有一個觸發器,如果需要,只能將原始的去掉,新增!
2, 只要事件發生,觸發程式就可能執行!一條語句可能觸發多個觸發程式!
例如:
insert into on duplicate key update
before insert trigger, insert 操作失敗 before update trigger, update操作, after update
before insert trigger, insert 操作成功 after insert trigger