Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z triggerem w MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
parzol
Witam.

To mój pierwszy kontakt z triggerami więc proszę o wyrozumiałość smile.gif

Mój kod:

  1. mysql> CREATE TRIGGER room_reservation_bi AFTER INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', NEW.id, MONTH(NOW()), YEAR(NOW()));


I dostaję błąd:
ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

Chciałem aby po dodaniu nowej rezerwacji do tabeli dla danej rezerwacji pole reservation_number mialo postac: 1/6/2008 czyli najpierw ID rekordu w tabeli potem miesiąc aktualny i rok.

Co robię zle? sciana.gif

Ten sam problem:

Link
artega
Jak widać MySQL nie zezwala na aktualizacje nowego rekordu w wyzwalaczu uruchamianym po wprowadzeniu danych. Rozwiązanie może być takie:
  1. CREATE TRIGGER room_reservation_bi BEFORE INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', LAST_INSERT_ID()+1, MONTH(NOW()), YEAR(NOW()))
woj_tas
W oraclu problem ten nazywa się "Mutujące tablice" (mutating tables) i występuję tylko w przypadku trigerów wierszowych (row level triggers), czyli tych zawierających opcję FOR EACH ROW. Jeżeli przekształcisz wyzwalacz wierszowy (row triggers) w wyzwalacz poleceniowy (statement
triggers) powinno zadziałać. Niestety nie będziesz miał wtedy dostępu do zmiennych NEW i OLD.
Dotyczy to Oracla, myślę jednak że w MySql jedst podobnie.

Pozdrawiam
parzol
Cytat(artega @ 28.06.2008, 07:15:50 ) *
Jak widać MySQL nie zezwala na aktualizacje nowego rekordu w wyzwalaczu uruchamianym po wprowadzeniu danych. Rozwiązanie może być takie:
  1. CREATE TRIGGER room_reservation_bi BEFORE INSERT ON room_reservation FOR EACH ROW SET NEW.reservation_number = CONCAT_WS('/', LAST_INSERT_ID()+1, MONTH(NOW()), YEAR(NOW()))



Po pierwsze LAST_INSERT_ID() jest niebezpieczne bo co jesli w tym samym czasie gdzie indziej w bazie zostanie dodany ID?
Po drugie jaki to ma sens z BEFORE? Skoro chce dodac nadany ID to skad on go ma wziasc przed insertem? sadsmiley02.gif

Cytat(woj_tas @ 28.06.2008, 08:52:39 ) *
W oraclu problem ten nazywa się "Mutujące tablice" (mutating tables) i występuję tylko w przypadku trigerów wierszowych (row level triggers), czyli tych zawierających opcję FOR EACH ROW. Jeżeli przekształcisz wyzwalacz wierszowy (row triggers) w wyzwalacz poleceniowy (statement
triggers) powinno zadziałać. Niestety nie będziesz miał wtedy dostępu do zmiennych NEW i OLD.
Dotyczy to Oracla, myślę jednak że w MySql jedst podobnie.

Pozdrawiam



I to by się zgadzało smile.gif Problem w tym że to co możliwe w Oracle niestety nie jest możliwe w pseudo bazie jaką jest niestety MySQL sad.gif

Link
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.