觸發(fā)器
每個表最多支持6個觸發(fā)器,(insert,update,delete)之前和之后。
- 刪除觸發(fā)器
drop trigger trigger_name;
- insert 觸發(fā)器
? 在INSERT觸發(fā)器代碼內(nèi),可引用一個名為NEW的虛擬表,訪問被插入的行;
? 在BEFORE INSERT觸發(fā)器中,NEW中的值也可以被更新(允許更改被插入的值);
? 對于AUTO_INCREMENT列,NEW在INSERT執(zhí)行之前包含0,在INSERT執(zhí)行之后包含新的自動生成值。
下面來看例子(這里書上的例子盡然不可以,不知道是不是版本的原因):
首先我們創(chuàng)建一個表用于記錄日志
CREATE TABLE product_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
prod_id VARCHAR(50),
action VARCHAR(50),
action_date DATETIME
);
創(chuàng)建一個觸發(fā)器
DELIMITER $$
CREATE TRIGGER newproduct
AFTER INSERT
ON products
FOR EACH ROW
BEGIN
--這個new 虛擬表可以拿到插入后的值
INSERT INTO product_log(prod_id, action, action_date)
VALUES (NEW.prod_id, 'product added', NOW());
END;$$
DELIMITER ;
同時我們是可以在插入之前修改值的
DELIMITER $$
CREATE TRIGGER beforeinsert
BEFORE INSERT
ON products
FOR EACH ROW
BEGIN
-- 插入之前更新值
set NEW.prod_price = 111.0;
END;$$
INSERT INTO `products` VALUES ('ANV10', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
我們可以看到執(zhí)行結(jié)果,我們插入里面寫的是5.99但是最終存儲是111.0是因為在插入之前我們更新了這個值
注:這里還有一點在使用before更新值的時候,我們這個列不能是外鍵,外鍵是不能更新成功的。主鍵可以被更新。
- update觸發(fā)器
? 在UPDATE觸發(fā)器代碼中,你可以引用一個名為OLD的虛擬表訪問以前(UPDATE語句前)的值,引用一個名為NEW的虛擬表訪問新更新的值;
? 在BEFORE UPDATE觸發(fā)器中,NEW中的值可能也被更新(允許更改將要用于UPDATE語句中的值);
? OLD中的值全都是只讀的,不能更新。
下面我們來看一個例子:
CREATE TABLE test_update(
id int not null auto_increment primary key,
before_id char(50) not null,
after_id char(50) not null
);
DELIMITER $$
CREATE TRIGGER afterupdate
AFTER UPDATE
ON products
FOR EACH ROW
BEGIN
INSERT INTO test_update(before_id,after_id)values(old.prod_id,new.prod_id);
END;$$
在update之前我們也可以new中的值,這個用法和insert一樣這里哦不在演示。文章來源:http://www.zghlxwxcb.cn/news/detail-446319.html
- delete觸發(fā)器
? 在DELETE觸發(fā)器代碼內(nèi),你可以引用一個名為OLD的虛擬表,訪問被刪除的行;
? OLD中的值全都是只讀的,不能更新。
這里直接用了之前的表,只是重新改了個名字測試
DELIMITER $$
CREATE TRIGGER beforedelete
BEFORE DELETE
ON products
FOR EACH ROW
BEGIN
INSERT INTO test_delete(before_id,after_id)values(old.prod_id,old.prod_id);
END;$$
這個在刪除之前和刪除之后都可以通過old虛擬表拿到值。文章來源地址http://www.zghlxwxcb.cn/news/detail-446319.html
到了這里,關于深入學習MYSQL-使用觸發(fā)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!