Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alternative zur Verwendung von Prepared Statement in Trigger mit MySQL

Die kurze Antwort lautet, dass Sie in einem TRIGGER kein dynamisches SQL verwenden können.

Ich bin verwirrt durch die Abfrage des auto_increment-Werts und das Zuweisen eines Werts zur ID-Spalte. Ich verstehe nicht, warum Sie den Wert der ID-Spalte festlegen müssen. Ist das nicht die Spalte, die als AUTO_INCREMENT definiert ist? Die Datenbank übernimmt die Zuordnung.

Es ist auch nicht klar, ob Ihre Abfrage garantiert eindeutige Werte zurückgibt, insbesondere wenn gleichzeitige Einfügungen ausgeführt werden. (Ich habe es nicht getestet, also könnte es funktionieren.)

Aber der Code ist eigenartig.

Es sieht so aus, als ob Sie versuchen, den Wert einer Spalte aus der zuletzt eingefügten Zeile abzurufen. Ich denke, es gibt einige Einschränkungen beim Abfragen derselben Tabelle, auf der der Trigger definiert ist. (Ich weiß sicher, dass es in Oracle gibt; MySQL ist vielleicht liberaler.)

Wenn ich so etwas tun müsste, würde ich so etwas versuchen:

 SELECT @prev_hash := t.hash AS prev_hash 
   FROM core_Test t
  ORDER BY t.ID DESC LIMIT 1;

 SET NEW.hash = @prev_hash; 

Aber noch einmal, ich bin mir nicht sicher, ob das funktionieren wird (ich müsste es testen). Wenn es bei einem einfachen Fall funktioniert, ist das kein Beweis dafür, dass es die ganze Zeit funktioniert, im Fall gleichzeitiger Einfügungen, im Fall einer erweiterten Einfügung usw.

Ich habe die Abfrage so geschrieben, dass sie einen Index in der ID-Spalte verwenden kann, um einen umgekehrten Scanvorgang durchzuführen. Wenn der Index nicht verwendet wird, würde ich versuchen, diese Abfrage umzuschreiben (wahrscheinlich als JOIN, um die bestmögliche Leistung zu erzielen.

 SELECT @prev_hash := t.hash AS prev_hash
   FROM ( SELECT r.ID FROM core_Test r ORDER BY r.ID DESC LIMIT 1 ) s
   JOIN core_Test t
     ON t.ID = s.ID

Auszug aus dem MySQL 5.1-Referenzhandbuch
E.1 Beschränkungen für gespeicherte Programme