Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Alternatywa dla użycia Prepared Statement w wyzwalaczu z MySQL

Krótka odpowiedź brzmi, że nie możesz używać dynamicznego SQL w TRIGGER.

Jestem zdezorientowany zapytaniem o wartość auto_increment i przypisaniem wartości do kolumny ID. Nie rozumiem, dlaczego musisz ustawić wartość kolumny ID. Czy to nie jest kolumna, która jest zdefiniowana jako AUTO_INCREMENT? Baza danych obsłuży zadanie.

Nie jest również jasne, czy zapytanie na pewno zwróci unikatowe wartości, zwłaszcza w przypadku równoczesnego wstawiania. (Nie testowałem, więc może zadziałać).

Ale kod jest osobliwy.

Wygląda na to, że próbujesz uzyskać wartość kolumny z ostatnio wstawionego wiersza. Myślę, że istnieją pewne ograniczenia dotyczące odpytywania tej samej tabeli, w której zdefiniowano wyzwalacz. (Wiem na pewno, że jest w Oracle; MySQL może być bardziej liberalny.)

Gdybym musiał zrobić coś takiego, spróbowałbym czegoś takiego:

 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 znowu, nie jestem pewien, czy to zadziała (musiałbym przetestować). Jeśli działa w prostym przypadku, nie jest to dowód na to, że działa cały czas, w przypadku współbieżnych wstawek, w przypadku wstawek rozszerzonych itp.

Napisałem zapytanie tak, jak to zrobiłem, aby mogło użyć indeksu w kolumnie ID, aby wykonać operację skanowania wstecznego. Jeśli nie używa indeksu, spróbuję przepisać to zapytanie (prawdopodobnie jako JOIN, aby uzyskać najlepszą możliwą wydajność.

 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

Fragment z podręcznika MySQL 5.1 Reference Manual
E.1 Ograniczenia dotyczące zapisanych programów




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Suma bieżąca w każdej grupie przy użyciu MySQL

  2. SQL:jak w tym przypadku tworzone jest zapytanie w kolejności sql

  3. Mysql ERROR 1005 (HY000):Nie można utworzyć tabeli 'tmp' (errno:13)

  4. wybieranie kolejnych liczb za pomocą zapytania SQL

  5. Pobierz wiersze z tabeli mysql do tablic php