mysql @@identity против sql-сервера last_insert_id()
-
18-09-2019 - |
Вопрос
Правильно ли я понимаю, что функция LAST_INSERT_ID() mysql не сбрасывается между попытками вставки (как это делает @@identity в sql-server)...что если непосредственно предшествующая операция вставки завершится неудачей, LAST_INSERT_ID() вернет pk любого значения pk последней вставки этого соединения в Любой таблица с автоматически увеличивающимся первичным ключом была.И если я прав в этом, не кажется ли это чуть ли не самым отсталым поведением для этой функции, которое только можно придумать?Нет ли функции mysql, которая ведет себя аналогично @@identity sql-сервера?Тот, который вернет NULL, если непосредственно предшествующий попытка вставки не создает новой записи?В качестве альтернативы, как можно с уверенностью узнать первичный ключ самой последней операции вставки?
Решение
@@identity также обычно неверен в sql server.Вы должны использовать scope_identity()
в большинстве случаев вместо этого.
В MySQL last_insert_id() должна быть безопасной в использовании, потому что единственный способ вызвать эту функцию после ошибки вставки - это то, что вы уже правильно поймали и учли ошибку вставки.В противном случае вы бы все еще обрабатывали команды.Другими словами, last_insert_id() не является вашим механизмом обработки ошибок.
Другие советы
Сначала вы должны проверить, прошла ли вставка успешно.Если вставка прошла успешно, то вы можете положиться на LAST_INSERT_ID().
Редактировать:в php:
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query('<PUT YOUR INSERT HERE');
if(mysql_affected_rows()>0){
$last_id=mysql_insert_id();
}else{
//panic!
}
?>