11

我希望该epc列始终为earnings/ clicks。我正在使用 AFTER UPDATE 触发器来完成此操作。因此,如果我要向该表添加 100 次点击,我希望 EPC 自动更新。

我正在尝试这个:

CREATE TRIGGER `records_integrity` AFTER UPDATE ON `records` FOR EACH ROW SET 
NEW.epc=IFNULL(earnings/clicks,0);

并得到这个错误:

MySQL said: #1362 - Updating of NEW row is not allowed in after trigger

我也尝试使用OLD,但也出现错误。我可以在之前做,但是如果我添加了 100 次点击,它将使用之前的 # 次点击作为触发器(对吗?)

我应该怎么做才能做到这一点?

编辑 - 将在此运行的查询示例:

UPDATE records SET clicks=clicks+100
//EPC should update automatically
4

2 回答 2

15

您不能在更新触发器中更新表中的行。

也许你想要这样的东西:

CREATE TRIGGER `records_integrity` BEFORE UPDATE
ON `records`
FOR EACH ROW
    SET NEW.epc=IFNULL(new.earnings/new.clicks, 0);

编辑:

在触发器内,您可以访问OLDNEWOLD是记录中的旧值,NEW是新值。在前触发器中,NEW是写入表的内容,因此您可以修改它们。在触发器中,NEW值已被写入,因此无法修改。我认为MySQL 文档很好地解释了这一点。

于 2013-07-24T00:55:35.923 回答
0

也许您可以在该事务中编写两个单独的语句

 update record set clicks=...

 update record set epc=...

或者您可以将它们放在一个函数中,比如 updateClick() 并调用该函数。通过这样做,您可以在需要时轻松更改逻辑。

将逻辑放在触发器中可能会导致调试和跟踪变得不必要地复杂。

于 2013-07-24T05:08:42.273 回答