我希望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
答案 0 :(得分:13)
您无法在更新后的更新触发器中更新表格中的行。
也许你想要这样的东西:
CREATE TRIGGER `records_integrity` BEFORE UPDATE
ON `records`
FOR EACH ROW
SET NEW.epc=IFNULL(new.earnings/new.clicks, 0);
编辑:
在触发器内,您可以访问OLD
和NEW
。 OLD
是记录中的旧值,NEW
是新值。在之前触发器中,NEW
值是写入表的内容,因此您可以修改它们。在 after 触发器中,NEW
值已经写入,因此无法修改它们。我认为MySQL documentation很好地解释了这一点。
答案 1 :(得分:0)
也许你可以在该交易中写两个单独的陈述
update record set clicks=...
update record set epc=...
或者你可以把它们放在一个函数中,比如说updateClick(),然后调用那个函数。通过这种方式,您可以在需要时轻松改变逻辑。
将逻辑置于触发器中可能会导致调试和跟踪变得不必要的复杂情况。