mysql @@ удостоверение личности против sql-сервера last_insert_id () - PullRequest
6 голосов
/ 05 февраля 2010

Правильно ли я понимаю, что функция mysql LAST_INSERT_ID () не сбрасывается между попытками вставки (как @@ identity делает в sql-сервере) ... что в случае сбоя непосредственно предшествующей операции вставки LAST_INSERT_ID () вернет pk любого pk последней вставки этого соединения в любую таблицу с автоматически увеличивающимся первичным ключом. И если я прав в этом, разве это не похоже на самое запаздывающее поведение для этой функции, которое можно придумать? Разве нет функции mysql, которая ведет себя так же, как @@ идентичность sql-сервера? Тот, который возвратит NULL, если , непосредственно предшествующий попытке вставки, не создает новую запись? Кроме того, как можно с уверенностью узнать первичный ключ самой последней операции вставки?

Ответы [ 2 ]

6 голосов
/ 05 февраля 2010

@@ тождественность обычно неверна и на сервере sql. Вы должны использовать scope_identity() в большинстве случаев вместо

В MySql last_insert_id () должен быть безопасным для использования, потому что единственный способ вызвать эту функцию после ошибки вставки - это то, что вы уже правильно отловили и учли ошибку вставки. В противном случае вы все равно будете обрабатывать команды. Другими словами, last_insert_id () не является вашим механизмом обработки ошибок.

1 голос
/ 05 февраля 2010

Сначала необходимо проверить, была ли вставка успешной. Если вставка прошла успешно, вы можете положиться на 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!
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...