Влияют ли триггеры ДО ОБНОВЛЕНИЯ на результаты mysqli_insert_id?

У меня есть таблица mysql, к которой прикреплен триггер, который регистрирует изменения в этой таблице во второй

CREATE TRIGGER log_table BEFORE UPDATE ON table1
  FOR EACH ROW BEGIN
    INSERT INTO log_table(filed) VALUES(NEW.field);
  END;
//

Теперь, если я выполняю INSERT INTO table1 из PHP вызов mysqli_insert_id() после этого.

Будет ли это вернуть новый идентификатор в таблице1? Или новый идентификатор в log_table?

1 ответ

Решение

LAST_INSERT_ID() Вызывается после того, как оператор INSERT вернет новый идентификатор в table1 (оператора INSERT), а не идентификатор в log_table (триггера).

Это задокументировано в разделе руководства LAST_INSERT_ID:

В теле хранимой подпрограммы (процедуры или функции) или триггера значение LAST_INSERT_ID() изменяется так же, как и для операторов, выполняемых вне тела объектов такого типа. Влияние хранимой подпрограммы или триггера на значение LAST_INSERT_ID(), которое видно из следующих операторов, зависит от вида подпрограммы:

  • Если хранимая процедура выполняет операторы, которые изменяют значение LAST_INSERT_ID(), измененное значение видно по операторам, которые следуют за вызовом процедуры.

  • Для сохраненных функций и триггеров, которые изменяют значение, значение восстанавливается после завершения функции или триггера, поэтому следующие операторы не увидят измененное значение.

Другие вопросы по тегам