【发布时间】:2013-08-12 18:46:42
【问题描述】:
我以前从未编写过触发器,我正在学习http://net.tutsplus.com/tutorials/databases/introduction-to-mysql-triggers/ 的教程,但我对某些事情感到困惑。
我正在尝试编写一个触发器,该触发器在插入后从表中提取数据并将其记录到历史表中。到目前为止,这是我的代码:
DELIMITER $$
CREATE TRIGGER trackHistory
AFTER INSERT ON test.inventory
FOR EACH ROW BEGIN
***
END;
DELIMITER ;
我需要添加一个 INSERT INTO history... 查询,但我不明白如何引用“库存”表的正确行上的字段。 UPDATE 或 DELETE 的答案是否相同?
编辑: 我已尝试按照以下答案的建议进行操作,但没有成功我收到此错误
1363 - INSERT 触发器中没有 OLD 行。怎么了?
DELIMITER $$
CREATE TRIGGER trackInsertHistory
AFTER INSERT ON inventory
FOR EACH ROW BEGIN
INSERT INTO history
VALUES (NEW.ID, OLD.Quantity, NEW.Quantity, TIMESTAMP);
END$$
CREATE TRIGGER trackStockHistory
AFTER UPDATE ON inventory
FOR EACH ROW BEGIN
INSERT INTO history
VALUES (NEW.ID, OLD.Quantity, NEW.Quantity, TIMESTAMP);
END$$
DELIMITER ;
【问题讨论】:
-
INSERT 上只有新记录。对于 UPDATE,NEW 记录保存“新”值,OLD 记录保存“旧”值。
-
哦,当然。所以,我在插入更新后真正想做的是将表上的“old_quantity”和“new_quantity”都设置为 NEW.Quantity。再次感谢!
-
有趣...我现在收到此错误 #1235 - 此版本的 MySQL 尚不支持“一个表具有相同操作时间和事件的多个触发器”...我想我只是需要在两个单独的查询中执行此操作吗?
-
这将是安全的方式:)
-
也许你应该在历史记录中添加它是什么类型的更新(插入,更新)......或者,可以在 old=new 时推断出来