Mysql
 sql >> база данни >  >> RDS >> Mysql

Алтернатива на използването на Prepared Statement в Trigger с MySQL

Краткият отговор е, че не можете да използвате динамичен SQL в TRIGGER.

Объркан съм от заявката за стойността auto_increment и присвояването на стойност на колоната ID. Не разбирам защо трябва да зададете стойността на колоната ID. Това не е ли колоната, която е дефинирана като AUTO_INCREMENT? Базата данни ще се справи с присвояването.

Също така не е ясно дали вашата заявка гарантирано ще върне уникални стойности, особено когато се изпълняват едновременни вмъквания. (Не съм тествал, така че може да работи.)

Но кодът е странен.

Изглежда, че това, което се опитвате да постигнете, е да получите стойността на колона от най-скоро вмъкнатия ред. Мисля, че има някои ограничения за запитване до същата таблица, върху която е дефиниран тригерът. (Знам със сигурност, че има в Oracle; MySQL може да е по-либерален.)

Ако трябваше да направя нещо подобно, бих опитал нещо подобно:

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

 SET NEW.hash = @prev_hash; 

Но отново, не съм сигурен, че това ще работи (ще трябва да тествам). Ако работи в прост случай, това не е доказателство, че работи през цялото време, в случай на едновременни вмъквания, в случай на разширено вмъкване и др.

Написах заявката по начина, по който го направих, така че да може да използва индекс в колоната ID, за да извърши операция за обратно сканиране. Ако не използва индекса, бих опитал да пренапиша тази заявка (вероятно като JOIN, за да получа възможно най-доброто представяне.

 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

Извадка от Справочно ръководство за MySQL 5.1
E.1 Ограничения за съхранени програми




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да получа непразен набор от резултати, когато използвам select, group by и count?

  2. Невалиден номер на параметър:няма обвързани параметри

  3. Разделете данните на 3 колони

  4. Codeigniter ActiveRecord:присъединяване обратно

  5. MySql count() за връщане на 0, ако няма намерени записи