每个表最多支持6个触发器,(insert,update,delete)之前和之后。
drop trigger trigger_name;
CREATE TABLE product_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
prod_id VARCHAR(50),
action VARCHAR(50),
action_date DATETIME
);
创建一个触发器
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');
我们可以看到执行结果,我们插入里面写的是5.99但是最终存储是111.0是因为在插入之前我们更新了这个值
注:这里还有一点在使用before更新值的时候,我们这个列不能是外键,外键是不能更新成功的。主键可以被更新。
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一样这里哦不在演示。
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;$$