Влияют ли триггеры ДО ОБНОВЛЕНИЯ на результаты 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(), измененное значение видно по операторам, которые следуют за вызовом процедуры.
Для сохраненных функций и триггеров, которые изменяют значение, значение восстанавливается после завершения функции или триггера, поэтому следующие операторы не увидят измененное значение.