2010-02-05 25 views
5

¿Tengo razón en entender que la función LAST_INSERT_ID() de mysql no se restablece entre intentos de inserción (como @@ identity does en sql-server) ... eso si el la operación de inserción anterior falla, LAST_INSERT_ID() devolverá el pk de cualquier pk de la última inserción de esa conexión a cualquier tabla con una clave primaria de incremento automático. Y si estoy en lo correcto en esto, ¿esto no parece ser el comportamiento más retardado para esta función que uno podría tener? ¿No hay una función mysql que se comporte de manera similar a @@ identity de sql-server? Uno que devolverá NULL si el intento de inserción inmediatamente anterior a no crea un nuevo registro? Alternativamente, ¿cómo se sabe con certeza la clave primaria de la operación de inserción más reciente?mysql @@ identity vs sql-server last_insert_id()

+5

@@ identidad le da la más reciente inserción en cualquier ámbito. Esto podría ser el resultado de un desencadenador que no tiene nada que ver con la instrucción de inserción que acaba de ejecutar. en el servidor SQL generalmente quiere usar la función scope_identity(). – feihtthief

+0

@feihtthief - thx, buena aclaración +1 – codemonkey

+0

Tenga en cuenta que @@ identity y scope_identity() de SQL Server, cuando se utilizan con inserciones de múltiples filas en un servidor con múltiples procesadores, ¡pueden dar respuestas incorrectas! Usar OPTION (MAXDOP 1) es una solución alternativa. – ErikE

Respuesta

6

@@ la identidad suele ser incorrecta en el servidor sql también. En su lugar, debería usar scope_identity() en la mayoría de los casos.

En MySql, last_insert_id() debe ser seguro de usar porque la única manera en que puede llamar a esta función después de un error de inserción es que ya ha atrapado y contabilizado correctamente el error de inserción. De lo contrario, seguirías procesando comandos. En otras palabras, last_insert_id() no es su mecanismo de manejo de errores.

+0

@párrafo 2: me hace replantearme la forma en que estoy estructurando la declaración de inserción ... en este caso, la cláusula where de la instrucción select que está alimentando la inserción determina si una inserción ocurre o no. en otras palabras, el inserto es 0+ registros dependiendo de las condiciones de la cláusula where. Supongo que puedo sacar los que están fuera del inserto y realizar el inserto condicionalmente. buena solución, pero se siente como una solución para mí. – codemonkey

1

Primero tiene que comprobar si la inserción fue exitosa. Si la inserción fue exitosa, puede confiar en LAST_INSERT_ID().

edición: en 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! 
} 
?> 
+0

me pregunto si hay una función mysql nativa similar a msyql_affected_rows() de php todo nuestro dml reside en la base de datos como procedimientos/funciones almacenados. – codemonkey

+0

http://php.net/manual/en/function.mysql-query.php Para otro tipo de sentencias de SQL, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() devuelve TRUE en caso de éxito o FALSE en caso de error. – Notinlist

+1

Una instrucción de inserción podría ser "exitosa" y NO hacer ninguna inserción. Considere una instrucción INSERT IGNORE. En este caso, confiar en el valor de retorno de mysql_query() producirá un resultado incorrecto. –