SQL觸發器定義與使用

比如:現需要向學生表中插入新的學生數據。但在插入學生數據的時,需要同時檢查老師表裡的數據。如果插入學生的老師不在老師表裡,則先向老師表中插入一條老師數據,再向學生表中插入學生數據。

CALL sp_add_student( 
'S20170091', '楊艷', '女', '2003-04-09',
15, 'G0206', 89.23, 'T0021'
);

如果有多個學生的數據需要插入,則需要多次調用該存儲過程;可否不開發存儲過程,在向student表插入(INSERT)數據前,後臺自動判斷並插入老師數據?

觸發器簡介

觸發器:一種與表操作有關的數據庫對象,當觸發器所在表上出現指定事件(新增、修改、刪除數據)時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。

觸發器的創建及調用

比如:現需要向學生表中插入新的學生數據。但在插入學生數據的時,需要同時檢查老師表裡的數據。如果插入學生的老師不在老師表裡,則先向老師表中插入一條老師數據,再向學生表中插入學生數據。

觸發器的創建:使用關鍵字CREATE TRIGGER

CREATE TRIGGER tri_add_student BEFORE INSERT
ON student FOR EACH ROW
BEGIN
	IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id = new.teacher_id) THEN
	INSERT INTO teacher(teacher_id) VALUES (new.teacher_id);
END IF;
END;
INSERT INTO student VALUES(
'S20170092', '李文', '女', '2002-11-19',
16, 'G0206', 55.32, 'T0022'
);

觸發器的分類及執行順序

按事件類型分:

  • INSERT觸發器;
  • UPDATE觸發器;
  • DELETE觸發器;

按執行先後分:

  • BEFORE觸發器;
  • AFTER觸發器;

NEW與OLD:

  • INSERT觸發器:NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新數據;
  • UPDATE觸發器:OLD 用來表示將要或已經被修改的原數據,NEW 用來表示將要或已經修改為的新數據;
  • DELETE觸發器:OLD 用來表示將要或已經被刪除的原數據;

觸發器執行時的異常情況:

  • 如果 BEFORE 觸發器執行失敗,SQL 無法正確執行;
  • SQL 執行失敗時,AFTER 型觸發器不會觸發;
  • AFTER 類型的觸發器執行失敗,SQL 會回滾;

觸發器的刪除

觸發器的刪除:使用關鍵字DROP TRIGGER

如:DROP TRIGGER tri_add_student;

觸發器的優缺點

優點:

  • 自動觸發,無需調用;
  • 提供瞭一種檢查、保證數據完整性的方法;
  • 與存儲過程一樣,增強SQL語言的功能和靈活性;

缺點:

  • 開發調試困難;
  • 可移植性差;

到此這篇關於SQL觸發器定義與使用的文章就介紹到這瞭,更多相關SQL觸發器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: