Обновить ту же строку после обновления в триггере

Я хочу всегда 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 () и просто вызвать эту функцию. Делая это таким образом, вы можете легко изменить свою логику, если возникнет необходимость.

помещение логики внутри триггера может создать ситуацию, когда отладка и трассировка становятся излишне сложными.