Krótka odpowiedź brzmi, że nie możesz używać dynamicznego SQL w TRIGGER.
Jestem zdezorientowany zapytaniem o wartość auto_increment i przypisaniem wartości do kolumny ID. Nie rozumiem, dlaczego musisz ustawić wartość kolumny ID. Czy to nie jest kolumna, która jest zdefiniowana jako AUTO_INCREMENT? Baza danych obsłuży zadanie.
Nie jest również jasne, czy zapytanie na pewno zwróci unikatowe wartości, zwłaszcza w przypadku równoczesnego wstawiania. (Nie testowałem, więc może zadziałać).
Ale kod jest osobliwy.
Wygląda na to, że próbujesz uzyskać wartość kolumny z ostatnio wstawionego wiersza. Myślę, że istnieją pewne ograniczenia dotyczące odpytywania tej samej tabeli, w której zdefiniowano wyzwalacz. (Wiem na pewno, że jest w Oracle; MySQL może być bardziej liberalny.)
Gdybym musiał zrobić coś takiego, spróbowałbym czegoś takiego:
SELECT @prev_hash := t.hash AS prev_hash
FROM core_Test t
ORDER BY t.ID DESC LIMIT 1;
SET NEW.hash = @prev_hash;
Ale znowu, nie jestem pewien, czy to zadziała (musiałbym przetestować). Jeśli działa w prostym przypadku, nie jest to dowód na to, że działa cały czas, w przypadku współbieżnych wstawek, w przypadku wstawek rozszerzonych itp.
Napisałem zapytanie tak, jak to zrobiłem, aby mogło użyć indeksu w kolumnie ID, aby wykonać operację skanowania wstecznego. Jeśli nie używa indeksu, spróbuję przepisać to zapytanie (prawdopodobnie jako JOIN, aby uzyskać najlepszą możliwą wydajność.
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 z podręcznika MySQL 5.1 Reference Manual
E.1 Ograniczenia dotyczące zapisanych programów