Jawaban singkatnya adalah Anda tidak dapat menggunakan SQL dinamis dalam TRIGGER.
Saya bingung dengan kueri nilai auto_increment, dan menetapkan nilai ke kolom ID. Saya tidak mengerti mengapa Anda perlu mengatur nilai kolom ID. Bukankah itu kolom yang didefinisikan sebagai AUTO_INCREMENT? Basis data akan menangani tugas.
Juga tidak jelas bahwa kueri Anda dijamin mengembalikan nilai unik, terutama saat penyisipan bersamaan dijalankan. (Saya belum menguji, jadi mungkin berhasil.)
Tapi kodenya aneh.
Sepertinya yang ingin Anda capai adalah mendapatkan nilai kolom dari baris yang paling baru dimasukkan. Saya pikir ada beberapa batasan untuk menanyakan tabel yang sama dengan pemicu yang ditentukan. (Saya tahu pasti ada di Oracle; MySQL mungkin lebih liberal.)
Jika saya perlu melakukan sesuatu seperti itu, saya akan mencoba sesuatu seperti ini:
SELECT @prev_hash := t.hash AS prev_hash
FROM core_Test t
ORDER BY t.ID DESC LIMIT 1;
SET NEW.hash = @prev_hash;
Tetapi sekali lagi, saya tidak yakin ini akan berhasil (saya perlu menguji). Jika berhasil pada kasus sederhana, itu bukan bukti bahwa ia bekerja sepanjang waktu, dalam kasus penyisipan bersamaan, dalam kasus penyisipan diperpanjang, dkk.
Saya menulis kueri seperti yang saya lakukan sehingga dapat menggunakan indeks pada kolom ID, untuk melakukan operasi pemindaian terbalik. Jika tidak menggunakan indeks, saya akan mencoba menulis ulang kueri itu (mungkin sebagai GABUNG, untuk mendapatkan kinerja terbaik.
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
Kutipan dari Manual Referensi MySQL 5.1
E.1 Batasan pada Program Tersimpan