sql >> Base de Datos >  >> RDS >> Mysql

Alternativa al uso de declaraciones preparadas en Trigger con MySQL

La respuesta corta es que no puede usar SQL dinámico en un TRIGGER.

Estoy confundido por la consulta del valor de auto_incremento y la asignación de un valor a la columna ID. No entiendo por qué necesita establecer el valor de la columna ID. ¿No es esa la columna que se define como AUTO_INCREMENT? La base de datos se encargará de la asignación.

Tampoco está claro que se garantice que su consulta devuelva valores únicos, especialmente cuando se ejecutan inserciones simultáneas. (No lo he probado, por lo que podría funcionar).

Pero el código es peculiar.

Parece que lo que intenta lograr es obtener el valor de una columna de la fila insertada más recientemente. Creo que hay algunas restricciones para consultar la misma tabla en la que está definido el disparador. (Sé con certeza que existe en Oracle; MySQL puede ser más liberal).

Si tuviera que hacer algo así, intentaría algo como esto:

 SELECT @prev_hash := t.hash AS prev_hash 
   FROM core_Test t
  ORDER BY t.ID DESC LIMIT 1;

 SET NEW.hash = @prev_hash; 

Pero nuevamente, no estoy seguro de que esto funcione (tendría que probarlo). Si funciona en un caso simple, eso no prueba que funcione todo el tiempo, en el caso de inserciones simultáneas, en el caso de una inserción extendida, etc.

Escribí la consulta de la forma en que lo hice para que pueda hacer uso de un índice en la columna ID, para realizar una operación de escaneo inverso. Si no usa el índice, intentaría reescribir esa consulta (probablemente como JOIN, para obtener el mejor rendimiento posible).

 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

Extracto del manual de referencia de MySQL 5.1
E.1 Restricciones en programas almacenados