dedlfix: Datenbank sortieren (MySQL 5.0.67)

Beitrag lesen

Hi!

CREATE TRIGGER triggername BEFORE INSERT ON test FOR EACH ROW SET NEW.spalte = max(spalte)+1;
Das nimmt er auch an, aber bei INSERT krieg ich dann "ERROR 1111 (HY000): Invalid use of group function". Wie kann ich den Trigger sonst definieren?

Nimm eine Subquery:

CREATE TRIGGER triggername BEFORE INSERT ON test FOR EACH ROW SET NEW.spalte = (SELECT max(spalte) FROM test) +1;

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.

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.

Lo!