sql >> Database teknologi >  >> RDS >> Mysql

Alternativ til at bruge Prepared Statement i Trigger med MySQL

Det korte svar er, at du ikke kan bruge dynamisk SQL i en TRIGGER.

Jeg er forvirret over forespørgslen om auto_increment-værdien og tildeling af en værdi til ID-kolonnen. Jeg forstår ikke, hvorfor du skal indstille værdien af ​​ID-kolonnen. Er det ikke den kolonne, der er defineret som AUTO_INCREMENT? Databasen vil håndtere opgaven.

Det er heller ikke klart, at din forespørgsel med garanti vil returnere unikke værdier, især når der køres samtidige indsættelser. (Jeg har ikke testet, så det kan virke.)

Men koden er ejendommelig.

Det ser ud som om det, du forsøger at opnå, er at få værdien af ​​en kolonne fra den senest indsatte række. Jeg tror, ​​der er nogle begrænsninger for at forespørge på den samme tabel, som triggeren er defineret på. (Jeg ved med sikkerhed, at der er i Oracle; MySQL kan være mere liberalt.)

Hvis jeg havde brug for at gøre sådan noget, ville jeg prøve noget som dette:

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

 SET NEW.hash = @prev_hash; 

Men igen, jeg er ikke sikker på, at dette vil virke (jeg bliver nødt til at teste). Hvis det virker på en simpel sag, er det ikke et bevis på, at det virker hele tiden, i tilfælde af samtidige indsættelser, i tilfælde af en udvidet indsættelse, et al.

Jeg skrev forespørgslen, som jeg gjorde, så den kan bruge et indeks på ID-kolonnen til at udføre en omvendt scanningsoperation. Hvis den ikke bruger indekset, ville jeg prøve at omskrive den forespørgsel (sandsynligvis som en JOIN, for at få den bedst mulige ydeevne.

 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

Uddrag fra MySQL 5.1 Reference Manual
E.1 Begrænsninger for lagrede programmer




  1. Måder, hvorpå adgang kan spare din virksomheds penge

  2. Sender OracleLob som parameter til en funktion

  3. Fatal fejl:Kald til udefineret funktion getRecords() i C:\xampp\htdocs\Employees.php på linje 101

  4. MySQL - Dublet indtastningsfejl ved forsøg på at tilføje ny kolonne