Обновить ту же строку после обновления в триггере
Я хочу всегда 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
Я попытался использовать старый, но также получил ошибку. Я мог бы сделать это раньше, но тогда, если бы я добавил 100 кликов, он использовал бы предыдущие # клики для триггера (не так ли?)
что я должен сделать, чтобы достичь этого?
EDIT-пример запроса, который будет выполняться на этом:
UPDATE records SET clicks=clicks+100
//EPC should update automatically
2 ответов
вы не можете обновлять строки в таблице в после триггер обновления.
вы хотите что-то вроде этого:CREATE TRIGGER `records_integrity` BEFORE UPDATE
ON `records`
FOR EACH ROW
SET NEW.epc=IFNULL(new.earnings/new.clicks, 0);
EDIT:
внутри триггера, у вас есть доступ к OLD
и NEW
. OLD
старые значения в записи и NEW
новые ценности. В до триггер,NEW
значения-это то, что записывается в таблицу, поэтому вы можете их изменить. В после триггер, NEW
значения уже записаны, поэтому их нельзя изменить. Я думаю, что документация MySQL объясняет это очень хорошо.
возможно, вы могли бы написать два отдельных заявления в этой сделке
update record set clicks=...
update record set epc=...
или вы можете поместить их в функцию, скажем updateClick () и просто вызвать эту функцию. Делая это таким образом, вы можете легко изменить свою логику, если возникнет необходимость.
помещение логики внутри триггера может создать ситуацию, когда отладка и трассировка становятся излишне сложными.