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