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