Hi
Nimm eine Subquery:
CREATE TRIGGER triggername BEFORE INSERT ON test FOR EACH ROW SET NEW.spalte = (SELECT max(spalte) FROM test) +1;
Wie ich bereits geschrieben hatte, bin ich allein drauf gekommen. Allerdings muss noch ein IF() rein, falls die Tabelle leer ist, sonst werden nur NULLen eingefügt. Trotzdem danke!
Vermutlich ist das in der Art aber nicht thread-safe. Wenn du gleichzeitige Zugriffe erwartest, kann es möglicherweise passieren, dass Prozess B das selbe Ergebnis aus der Subquery bekommt, wenn sie zwischen der Subquery und dem Einfügen von Prozess A abgearbeitet wird.
Wie wahrscheinlich ist es denn, dass so etwas passieren könnte?
Ist das auch möglich, wenn alle Zugriffe über PHP kommen? Ich benutze mysql_pconnect()
Dass ich vermute, liegt daran, dass ich keine Aussage fand, ob der INSERT-Vorgang zusammen mit dem Trigger einen atomaren Vorgang bilden. Wenn du also nebenläufige Einfügevorgänge erwartest, kann ich nur anbieten, vor dem Insert die Tabelle zu sperren und nachher wieder aufzuheben. Leider lässt sich das nicht in einer Stored Procedure kapseln, denn darin sind LOCK/UNLOCK TABLE nicht möglich.
Gut, jetzt bin ich wieder etwas überfordert... Wenn ich vor dem INSERT ein LOCK und danach wieder ein UNLOCK absetze, reicht das dann?
mfg
Felix