Det korta svaret är att du inte kan använda dynamisk SQL i en TRIGGER.
Jag är förvirrad av frågan om auto_increment-värdet och att tilldela ett värde till ID-kolumnen. Jag förstår inte varför du behöver ställa in värdet på ID-kolumnen. Är det inte den kolumn som definieras som AUTO_INCREMENT? Databasen kommer att hantera uppdraget.
Det är inte heller klart att din fråga garanterat returnerar unika värden, särskilt när samtidiga inlägg körs. (Jag har inte testat, så det kanske fungerar.)
Men koden är märklig.
Det ser ut som om det du försöker åstadkomma är att få värdet på en kolumn från den senast infogade raden. Jag tror att det finns vissa begränsningar för att fråga samma tabell som utlösaren är definierad på. (Jag vet säkert att det finns i Oracle; MySQL kan vara mer liberalt.)
Om jag behövde göra något sådant skulle jag prova något sånt här:
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 återigen, jag är inte säker på att detta kommer att fungera (jag skulle behöva testa). Om det fungerar på ett enkelt fall, är det inte ett bevis på att det fungerar hela tiden, i fallet med samtidiga inlägg, i fallet med en utökad infogning, et al.
Jag skrev frågan som jag gjorde så att den kan använda ett index i ID-kolumnen för att göra en omvänd skanningsoperation. Om det inte använder indexet, skulle jag försöka skriva om den frågan (förmodligen som en JOIN, för att få bästa möjliga prestanda.
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
Utdrag ur MySQL 5.1 Referensmanual
E.1 Begränsningar för lagrade program