Краткият отговор е, че не можете да използвате динамичен SQL в TRIGGER.
Объркан съм от заявката за стойността auto_increment и присвояването на стойност на колоната ID. Не разбирам защо трябва да зададете стойността на колоната ID. Това не е ли колоната, която е дефинирана като AUTO_INCREMENT? Базата данни ще се справи с присвояването.
Също така не е ясно дали вашата заявка гарантирано ще върне уникални стойности, особено когато се изпълняват едновременни вмъквания. (Не съм тествал, така че може да работи.)
Но кодът е странен.
Изглежда, че това, което се опитвате да постигнете, е да получите стойността на колона от най-скоро вмъкнатия ред. Мисля, че има някои ограничения за запитване до същата таблица, върху която е дефиниран тригерът. (Знам със сигурност, че има в Oracle; MySQL може да е по-либерален.)
Ако трябваше да направя нещо подобно, бих опитал нещо подобно:
SELECT @prev_hash := t.hash AS prev_hash
FROM core_Test t
ORDER BY t.ID DESC LIMIT 1;
SET NEW.hash = @prev_hash;
Но отново, не съм сигурен, че това ще работи (ще трябва да тествам). Ако работи в прост случай, това не е доказателство, че работи през цялото време, в случай на едновременни вмъквания, в случай на разширено вмъкване и др.
Написах заявката по начина, по който го направих, така че да може да използва индекс в колоната ID, за да извърши операция за обратно сканиране. Ако не използва индекса, бих опитал да пренапиша тази заявка (вероятно като JOIN, за да получа възможно най-доброто представяне.
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
Извадка от Справочно ръководство за MySQL 5.1
E.1 Ограничения за съхранени програми