La réponse courte est que vous ne pouvez pas utiliser SQL dynamique dans un TRIGGER.
Je suis confus par la requête de la valeur auto_increment et l'attribution d'une valeur à la colonne ID. Je ne comprends pas pourquoi vous devez définir la valeur de la colonne ID. N'est-ce pas la colonne définie comme AUTO_INCREMENT ? La base de données se chargera de l'affectation.
Il n'est pas non plus clair que votre requête est garantie de renvoyer des valeurs uniques, en particulier lorsque des insertions simultanées sont exécutées. (Je n'ai pas testé, donc ça pourrait marcher.)
Mais le code est particulier.
Il semble que ce que vous essayez d'accomplir est d'obtenir la valeur d'une colonne à partir de la dernière ligne insérée. Je pense qu'il existe certaines restrictions sur l'interrogation de la même table sur laquelle le déclencheur est défini. (Je sais avec certitude qu'il y en a dans Oracle ; MySQL est peut-être plus libéral.)
Si j'avais besoin de faire quelque chose comme ça, j'essaierais quelque chose comme ça :
SELECT @prev_hash := t.hash AS prev_hash
FROM core_Test t
ORDER BY t.ID DESC LIMIT 1;
SET NEW.hash = @prev_hash;
Mais encore une fois, je ne suis pas sûr que cela fonctionnera (il faudrait que je teste). Si ça marche sur un cas simple, ce n'est pas la preuve que ça marche tout le temps, dans le cas d'insertions concurrentes, dans le cas d'une insertion étendue, et al.
J'ai écrit la requête comme je l'ai fait afin qu'elle puisse utiliser un index sur la colonne ID, pour effectuer une opération d'analyse inversée. S'il n'utilise pas l'index, j'essaierais de réécrire cette requête (probablement en tant que JOIN, pour obtenir les meilleures performances possibles.
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
Extrait du manuel de référence de MySQL 5.1
E.1 Restrictions sur les programmes stockés