sql >> Databáze >  >> RDS >> Mysql

Alternativa k použití připraveného příkazu v Trigger s MySQL

Krátká odpověď je, že nemůžete použít dynamické SQL v TRIGGER.

Jsem zmatený dotazem na hodnotu auto_increment a přiřazením hodnoty do sloupce ID. Nechápu, proč potřebujete nastavit hodnotu sloupce ID. Není to sloupec, který je definován jako AUTO_INCREMENT? Databáze zpracuje úkol.

Není také jasné, že váš dotaz zaručeně vrátí jedinečné hodnoty, zvláště když jsou spuštěny souběžné vkládání. (Netestoval jsem, takže by to mohlo fungovat.)

Ale kód je zvláštní.

Vypadá to, že se snažíte získat hodnotu sloupce z naposledy vloženého řádku. Myslím, že existují určitá omezení pro dotazování na stejnou tabulku, na které je definován trigger. (Určitě vím, že v Oracle existuje; MySQL může být liberálnější.)

Kdybych něco takového potřeboval udělat, zkusil bych něco takového:

 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 zase si nejsem jistý, že to bude fungovat (potřeboval bych to otestovat). Pokud to funguje na jednoduchém pouzdře, není to důkaz, že to funguje stále, v případě souběžných vložek, v případě prodloužené vložky atd.

Napsal jsem dotaz tak, jak jsem to udělal, takže může použít index ve sloupci ID k provedení operace zpětného skenování. Pokud nepoužívá index, zkusil bych tento dotaz přepsat (pravděpodobně jako JOIN, abych dosáhl co nejlepšího výkonu.

 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

Výňatek z referenční příručky MySQL 5.1
E.1 Omezení uložených programů




  1. Jak přistupovat ke vzdálenému serveru pomocí lokálního klienta phpMyAdmin?

  2. Oracle sqlldr -> nedefinovaný symbol:sldext

  3. Problémy, když uživatel zadává data do příkazu sql

  4. 4 způsoby, jak získat definici uložené procedury pomocí Transact-SQL