Ваш INSERT ... ON DUPLICATE KEY UPDATE
является способом предотвращения ошибки, если officer_number
уже существует.Вам нужно, чтобы произошло обновление (для запуска TRIGGER), или вы могли бы вместо этого использовать INSERT IGNORE
?:
INSERT IGNORE INTO officer (officer_number,
name,
bank_id)
VALUES ('',
'',
8);
Это бы просто ничего не делало, если officer_id
уже существует, таким образом устраняя необходимостьобновление (и, следовательно, LAST_INSERT_ID()
) в целом.
Если это невозможно, возможно, ваш INSERT ... ON DUPLICATE KEY UPDATE
может быть изменен.Мне неясно, для чего:
id = LAST_INSERT_ID(id)
LAST_INSERT_ID()
(без каких-либо аргументов) возвращает первое автоматически сгенерированное значение, которое было установлено для столбца AUTO_INCREMENT самой последней выполненной инструкцией INSERT, чтобы повлиять натакой столбец.
Однако, если вы задаете аргумент, он возвращает значение этого аргумента, а следующий вызов LAST_INSERT_ID()
(без каких-либо аргументов) возвращает то же значение.Например:
SELECT LAST_INSERT_ID(100);
+---------------------+
| LAST_INSERT_ID(100) |
+---------------------+
| 100 |
+---------------------+
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 100 |
+------------------+
Итак, если мы предположим, что id == 100
, то это должно быть верно:
SELECT LAST_INSERT_ID(id);
+--------------------+
| LAST_INSERT_ID(id) |
+--------------------+
| 100 |
+--------------------+
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 100 |
+------------------+
Исходя из этого:
id = LAST_INSERT_ID(id)
Должно быть таким же, как:
id = id
Или, как предположил Джош Дэвис, в этом не должно быть необходимости.Вы пробовали просто id = id
?Что именно происходит, когда вы исключаете его?
В руководстве указано, что:
Однако, если вы смешаете ссылки на LAST_INSERT_ID () и LAST_INSERT_ID (expr),эффект не определен
и:
Сгенерированный идентификатор сохраняется на сервере для каждого соединения .Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом .На это значение не могут повлиять другие клиенты, даже если они генерируют собственные значения AUTO_INCREMENT.
Поскольку вы используете LAST_INSERT_ID()
и LAST_INSERT_ID(expr)
, поведение не определено.Кроме того, TRIGGER может рассматриваться как одно соединение (оно запускается непосредственно на сервере), тогда как операторы INSERT и CREATE, возможно, вызываются из другого соединения.Учитывая это, а также различные изменения и ошибки, которые, как сообщалось, связаны с LAST_INSERT_ID между версиями, вполне вероятно, что будет проблем с вашим подходом.
Возвращаясь к тому, что сказал Джош Дэвис,Я был бы склонен разрешить использование id = LAST_INSERT_ID(id)
в вашем выражении INSERT.Также было бы полезно узнать, как вы получаете officer_id
в вашем INSERT INTO account
утверждении, которое получает нулевое значение.