Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger AFTER INSERT z obliczenie wartosci kolumny
Forum PHP.pl > Forum > Bazy danych > MySQL
maciekc
Witam!
Mam taki problem.
Mam tabelkę która ma columny X i Y,Z. Columna X jest AUTOINCREMENT.
Chce mieć trigger'a , który podczas insertu dokona obliczenia
Z=X+Y.
Gdy robie trigger before insert to w obliczeniu Z=X+Y, X jest równe zero( bo to kolumna AUTOINCREMENT).
Gdy kombinuje z triggerem after insert to też nie działa.

Czy ktoś wie jak ten problem rozwiązać.
Będę wdzięczny za pomoc
darko
To po kolei:
1) nie można wykonać tego, co chcesz przed insertem do tabeli, bo nie znamy aktualnej wartość autoinkrementowanej
2) jak ten trigger miałby pracować, tzn. opisz dokładnie, co ma się dziać, po obliczeniu wartości Z ? Z triggera ciężko jest cokolwiek zwrócić, najlepiej jakbyś chciał gdzieś tę wartość wstawić

http://www.roseindia.net/sql/trigger/mysql...er-insert.shtml
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
maciekc
Dzieki za odpowiedź.
Kolumna Z jest numerem inwentaryzacyjnym.
Numer ten jest sklejeniem następujących wartości: wartość X- (primary key AUTOINCREMENT), wartość Y-typ obiektu, no i jeszcze data dodania.
Ma to się obliczać z automatu podczas insert'a. No i tu jest problem z tym nieszczęsnym X(AUTOINCREMENT).
Próbowałem to zrobić triggerem after insert tzn. jak już się wstawi do bazy to wtedy wyciągam id za pomocą LAST_INSERTED_ID()
i robie UPDATE dla kolumny Z. Tylko wtedy baza zgłasza błąd:
"Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/trigger"
- rozumien to jako tymczasowe zablokowanie tabelki .
Co z tym cholerstwem zrobić?

Można od obiedy uzyć triggera BEFORE insert i wartość Z obliczyć za pomocą: Z=(Select MAX (X) from tabela +1 )+reszta
tylko czy taka procedura będzie niezawodna- co będzie jak w tym samym czasie dwie osoby będą wstawiać:
skowron-line
Cytat(maciekc @ 22.11.2012, 08:54:18 ) *
Można od obiedy uzyć triggera BEFORE insert i wartość Z obliczyć za pomocą: Z=(Select MAX (X) from tabela +1 )+reszta
tylko czy taka procedura będzie niezawodna- co będzie jak w tym samym czasie dwie osoby będą wstawiać:

Blokowanie tabeli
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
maciekc
Super!
Znaczy sie podczas wykonywania triggera tabela jest zablokowana do zapisu z automatu.
A tak wyciągnę Auto_increment :

SELECT Auto_increment FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = 'tabela' AND TABLE_NAME = 'baza';

Skowron-line, dziekuje za cenną wskazówkę.
darko
Cytat(maciekc @ 22.11.2012, 08:54:18 ) *
Dzieki za odpowiedź.
Kolumna Z jest numerem inwentaryzacyjnym.
Numer ten jest sklejeniem następujących wartości: wartość X- (primary key AUTOINCREMENT), wartość Y-typ obiektu, no i jeszcze data dodania.
Ma to się obliczać z automatu podczas insert'a. No i tu jest problem z tym nieszczęsnym X(AUTOINCREMENT).
Próbowałem to zrobić triggerem after insert tzn. jak już się wstawi do bazy to wtedy wyciągam id za pomocą LAST_INSERTED_ID()
i robie UPDATE dla kolumny Z. Tylko wtedy baza zgłasza błąd:
"Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/trigger"
- rozumien to jako tymczasowe zablokowanie tabelki .
Co z tym cholerstwem zrobić?

Można od obiedy uzyć triggera BEFORE insert i wartość Z obliczyć za pomocą: Z=(Select MAX (X) from tabela +1 )+reszta
tylko czy taka procedura będzie niezawodna- co będzie jak w tym samym czasie dwie osoby będą wstawiać:

To, o czym piszesz, że próbowałeś mogło by przejść pod warunkiem usunięcia wcześniej utworzonego triggera.
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.