Mysql
 sql >> Database >  >> RDS >> Mysql

Alternativa all'utilizzo di Prepared Statement in Trigger con MySQL

La risposta breve è che non puoi usare SQL dinamico in un TRIGGER.

Sono confuso dalla query del valore auto_increment e dall'assegnazione di un valore alla colonna ID. Non capisco perché è necessario impostare il valore della colonna ID. Non è quella la colonna definita come AUTO_INCREMENT? Il database gestirà l'assegnazione.

Inoltre, non è chiaro se è garantito che la query restituisca valori univoci, soprattutto quando vengono eseguiti inserimenti simultanei. (Non ho provato, quindi potrebbe funzionare.)

Ma il codice è peculiare.

Sembra che ciò che stai cercando di ottenere sia ottenere il valore di una colonna dalla riga inserita più di recente. Penso che ci siano alcune restrizioni sull'interrogazione della stessa tabella su cui è definito il trigger. (So ​​per certo che c'è in Oracle; MySQL potrebbe essere più liberale.)

Se avessi bisogno di fare qualcosa del genere, proverei qualcosa del genere:

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

 SET NEW.hash = @prev_hash; 

Ma ancora una volta, non sono sicuro che funzionerà (avrei bisogno di testare). Se funziona su un caso semplice, non è una prova che funzioni sempre, nel caso di inserti simultanei, nel caso di un inserto esteso, et al.

Ho scritto la query nel modo in cui l'ho fatto in modo che possa utilizzare un indice sulla colonna ID, per eseguire un'operazione di scansione inversa. Se non utilizza l'indice, proverei a riscrivere quella query (probabilmente come JOIN, per ottenere le migliori prestazioni possibili.

 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

Estratto dal manuale di riferimento MySQL 5.1
E.1 Restrizioni sui programmi archiviati