2013-07-24 4 views
8

Я хочу, чтобы колонка epc всегда была earnings/clicks. Я использую триггер AFTER UPDATE для выполнения этого. Поэтому, если бы я добавил 100 кликов к этой таблице, я бы хотел, чтобы EPC обновлялся автоматически.UPDATE Same Row после UPDATE в триггере

Я пытаюсь это:

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 кликов, он использовал бы предыдущие # щелчка для триггера (правильно?)

Что мне делать, чтобы это сделать?

EDIT - Пример запроса, который будет работать на этом:

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

ответ

10

Вы не можете обновлять строки в таблице в триггере после обновления.

Может быть, вы хотите что-то вроде этого:

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 documentation объясняет это довольно хорошо.

+0

Не является ли ваш новый ПОСЛЕ обновления? – hellohellosharp

+0

@hellohellosharp. , , Так или иначе, когда я посмотрел на код. ;) –

+0

Спасибо за обновление - ваш ответ, похоже, работает. Я запутался, хотя ... не будет ли обновление для BEFORE использовать неправильные значения для кликов и прибыли? – hellohellosharp

0

Может быть, вы могли бы написать два отдельных заявления в этой транзакции

update record set clicks=... 

update record set epc=... 

или вы можете поместить их внутри функции, скажем, updateClick() и просто вызвать эту функцию. Делая это таким образом, вы можете легко изменить свою логику, если возникнет такая необходимость.

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