mysql中觸發器

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.