vs2015網(wǎng)站開(kāi)發(fā)基礎(chǔ)樣式百度客服
mysql觸發(fā)器
觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程,在事件delete、insert、update發(fā)生時(shí)自動(dòng)執(zhí)行一條或多條SQL語(yǔ)句(執(zhí)行多條SQL語(yǔ)句需要用begin、end 包裹起來(lái))
創(chuàng)建觸發(fā)器
創(chuàng)建觸發(fā)器的四大必要條件
- 唯一的觸發(fā)器名稱
- 觸發(fā)器關(guān)聯(lián)的表
- 觸發(fā)器響應(yīng)的事件(delete、insert、update)
- 觸發(fā)器執(zhí)行時(shí)機(jī)(before、after)
創(chuàng)建觸發(fā)器語(yǔ)句示例
CREATE TRIGGER 觸發(fā)器名稱
BEFORE|AFTER 事件
ON 關(guān)聯(lián)的數(shù)據(jù)表
FOR EACH ROW
--單條SQL語(yǔ)句
INSERT xxxxx on xxx;
--多條語(yǔ)句用begin、end包裹
--BEGIN
-- INSERT xxxxx on xxx;
-- UPDATE xxx where xxx;
--END
查看觸發(fā)器
show triggers;
刪除觸發(fā)器
DROP trigger if exists 觸發(fā)器名;
注意:只有數(shù)據(jù)表才支持觸發(fā)器,視圖和臨時(shí)表都不支持,每個(gè)表最多支持6個(gè)觸發(fā)器(每條insert、update、delete的before和after),單一觸發(fā)器不能與多個(gè)事件和多個(gè)表關(guān)聯(lián)
觸發(fā)器使用
insert觸發(fā)器
insert觸發(fā)器在insert語(yǔ)句執(zhí)行之前(before)或者執(zhí)行之后(after)執(zhí)行,在insert觸發(fā)器代碼內(nèi),可以引用一個(gè)名為"NEW
" 的虛擬表,訪問(wèn)被插入的行。
在before insert 觸發(fā)器中,NEW 中的值可以被更新
對(duì)于QUTO_INCREMENT 的列,NEW 在 insert執(zhí)行之前包含0,執(zhí)行之后包含新的自動(dòng)生成值
示例
--在插入記錄后返回新增的id
CREATE TRIGGER mytrigger
AFTER insert
ON mytable
FOR EACH ROW
select NEW.id
delete觸發(fā)器
delete觸發(fā)器在delete語(yǔ)句執(zhí)行之前(before)或者執(zhí)行之后(after)執(zhí)行,在insert觸發(fā)器代碼內(nèi),可以引用一個(gè)名為"OLD
" 的虛擬表,訪問(wèn)被刪除的行。
虛擬表OLD中的值是只讀的
示例
--把刪除的記錄存檔
CREATE TRIGGER mytrigger
AFTER delete
ON mytable
FOR EACH ROW
begin
isnert into mytemp(id,name) values(OLD.id,OLD.name);
end;
update觸發(fā)器
update觸發(fā)器在update語(yǔ)句執(zhí)行之前(before)或者執(zhí)行之后(after)執(zhí)行,在update觸發(fā)器代碼內(nèi),可以引用一個(gè)名為"OLD
" 的虛擬表,訪問(wèn)舊記錄。引用一個(gè)名為"NEW
" 的虛擬表訪問(wèn)新更新的值。
在before update觸發(fā)器中,NEW 中的值可以被更新
虛擬表OLD中的值是只讀的
示例
--更新記錄時(shí),保證名字總是大小的
CREATE TRIGGER mytrigger
before update
ON mytable
FOR EACH ROW
begin
set NEW.NAME = Upper(NEW.NAME);
end;