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

Wyzwalacz MySQL do aktualizacji pola do wartości id

Nie znam żadnego sposobu, aby to zrobić w jednym stwierdzeniu, nawet przy użyciu wyzwalacza.

Rozwiązanie wyzwalacza, które sugerował @Lucky, wyglądałoby w MySQL tak:

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END

Jest jednak problem. W BEFORE INSERT faza, automatycznie wygenerowany id wartość nie została jeszcze wygenerowana. Więc jeśli group_id ma wartość null, domyślnie NEW.id co zawsze wynosi 0.

Ale jeśli zmienisz ten wyzwalacz na uruchamianie podczas AFTER INSERT faza, dzięki czemu masz dostęp do wygenerowanej wartości NEW.id , nie można modyfikować wartości kolumn.

MySQL nie obsługuje wyrażeń dla DEFAULT kolumny, więc nie można również zadeklarować tego zachowania w definicji tabeli. *Aktualizacja:MySQL 8.0.13 obsługuje DEFAULT (<expression>) ale wyrażenie nadal nie może zależeć od wartości automatycznego przyrostu (jest to udokumentowane ).

Jedynym rozwiązaniem jest wykonanie INSERT , a następnie natychmiast wykonaj UPDATE aby zmienić group_id jeśli nie jest ustawiony.

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować zdalne połączenie MySQL

  2. MySQL Workbench:Błąd w zapytaniu (1064):Błąd składni w pobliżu „VISIBLE” w wierszu 1

  3. DATABASE() — pobierz aktualną nazwę bazy danych w MySQL

  4. Obciąć wszystkie tabele w bazie danych MySQL w jednym poleceniu?

  5. Jak zainstalować MySQL na CentOS 6?