2013-07-24 10 views
8

Chcę, aby kolumna epc zawsze była earnings/clicks. Używam wyzwalacza PO UPDATE, aby to osiągnąć. Gdybym miał dodać 100 kliknięć do tej tabeli, chciałbym, aby EPC zaktualizowała się automatycznie.AKTUALIZACJA Ten sam wiersz po aktualizacji z wyzwalaczem

próbuję to:

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

I otrzymuję ten błąd:

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

Próbowałem za stary, jak dobrze, ale też masz błąd. Mogę zrobić PRZED, ale gdybym dodał 100 kliknięć, użyłbym wcześniejszych # kliknięć dla wyzwalacza (po prawej?)

Co powinienem zrobić, żeby to osiągnąć?

EDIT - Przykładem kwerendy, która będzie działać na to:

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

Odpowiedz

10

Nie można zaktualizować wiersze w tabeli w po wyzwalacz aktualizacji.

Może chcesz coś takiego:

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

EDIT:

wewnątrz wyzwalacza, trzeba mieć dostęp do OLD i NEW. OLD to stare wartości w rejestrze i nowe wartości to NEW. W przypadku wyzwalacza przed wartości, które są zapisywane w tabeli, są wartościami zapisanymi w tabeli, więc można je modyfikować. W wyzwalaczu po wartości NEW zostały już zapisane, więc nie można ich modyfikować. Myślę, że MySQL documentation wyjaśnia to całkiem dobrze.

+0

Czy to nie jest twoja aktualizacja po aktualizacji? – hellohellosharp

+0

@hellohellosharp. . . Jakoś nie było, gdy spojrzałem na kod. ;) –

+0

Dzięki za aktualizację - Twoja odpowiedź wydaje się działać. Jestem jednak zdezorientowany ... czy aktualizacja BEFORE nie użyłaby błędnych wartości dla kliknięć i zarobków? – hellohellosharp

0

Być może można napisać dwa oddzielne sprawozdania w tej transakcji

update record set clicks=... 

update record set epc=... 

lub można umieścić je wewnątrz funkcji, powiedzmy updateClick() i po prostu nazwać tę funkcję. Robiąc to w ten sposób, możesz łatwo zmienić swoją logikę, jeśli zajdzie taka potrzeba.

Umieszczenie logiki wewnątrz wyzwalacza może spowodować sytuację, w której debugowanie i śledzenie są niepotrzebnie skomplikowane.

Powiązane problemy