sql >> Database >  >> RDS >> Mysql

Alternatief voor het gebruik van Prepared Statement in Trigger met MySQL

Het korte antwoord is dat je geen dynamische SQL kunt gebruiken in een TRIGGER.

Ik ben in de war door de query van de auto_increment-waarde en het toewijzen van een waarde aan de ID-kolom. Ik begrijp niet waarom u de waarde van de ID-kolom moet instellen. Is dat niet de kolom die is gedefinieerd als de AUTO_INCREMENT? De database zal de opdracht afhandelen.

Het is ook niet duidelijk dat uw query gegarandeerd unieke waarden retourneert, vooral wanneer gelijktijdige invoegingen worden uitgevoerd. (Ik heb het niet getest, dus het zou kunnen werken.)

Maar de code is eigenaardig.

Het lijkt erop dat u probeert de waarde van een kolom uit de meest recent ingevoegde rij te halen. Ik denk dat er enkele beperkingen zijn voor het opvragen van dezelfde tabel waarop de trigger is gedefinieerd. (Ik weet zeker dat het in Oracle zit; MySQL kan liberaler zijn.)

Als ik zoiets zou moeten doen, zou ik zoiets als dit proberen:

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

 SET NEW.hash = @prev_hash; 

Maar nogmaals, ik weet niet zeker of dit zal werken (ik zou het moeten testen). Als het werkt op een eenvoudig geval, is dat geen bewijs dat het altijd werkt, in het geval van gelijktijdige inserts, in het geval van een uitgebreide insert, et al.

Ik heb de query op dezelfde manier geschreven, zodat deze gebruik kan maken van een index in de ID-kolom om een ​​omgekeerde scanbewerking uit te voeren. Als het de index niet gebruikt, zou ik proberen die query te herschrijven (waarschijnlijk als een JOIN, om de best mogelijke prestaties te krijgen.

 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

Fragment uit MySQL 5.1 Reference Manual
E.1 Beperkingen op opgeslagen programma's




  1. SQL Server Bulk invoegen van CSV-bestand met inconsistente aanhalingstekens

  2. Query voor element van array in JSON-kolom

  3. Vervang REGEXP_SUBSTR in SQL Server

  4. Hoe te controleren of mysql db is dat de gebruiker deel uitmaakt van een groep