【问题标题】:how to write a mysql trigger to log history如何编写一个mysql触发器来记录历史
【发布时间】: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 时推断出来

标签: mysql sql triggers


【解决方案1】:

它们被称为 NEW 和 OLD。

NEW 是要插入的新记录或更新的数据。

OLD 是删除的记录,或更新前的旧数据。

【讨论】:

  • 我刚刚进行了编辑,我不知道如何遵循您的建议。请指教。
【解决方案2】:

在 INSERT 触发器中,只能使用NEW.col_name;没有旧行。在 DELETE 触发器中,只能使用OLD.col_name;没有新行。在 UPDATE 触发器中,您可以使用 OLD.col_name 引用更新前的行的列,使用 NEW.col_name 引用更新后的行的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2015-06-14
    • 2011-01-15
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多