¿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()
Respuesta
@@ 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.
@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
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!
}
?>
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
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
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. –
- 1. LAST_INSERT_ID() MySQL
- 2. mysql recibiendo last_insert_id() en un desencadenante
- 3. fundido no válida al volver LAST_INSERT_ID mysql() usando dapper.net
- 4. Cursores vs. ciclo while - SQLServer
- 5. Usando LAST_INSERT_ID() via PHP?
- 6. Equivalente a MSSQL IDENTITY Columna en MySQL
- 7. MySQL y la posibilidad de que ID LAST_INSERT_ID()
- 8. MySQL LAST_INSERT_ID() se utiliza con varios registros instrucción INSERT
- 9. len() Vs datalength() en sqlserver 2005
- 10. Almacenamiento FILESTREAM en SqlServer -> equivalente MySQL?
- 11. anula "/ auth/identity" -página de omniauth identity
- 12. SQL Server IDENTITY Columna con texto
- 13. SQLServer vs StateServer para ASP.NET Session State Performance
- 14. ¿El equivalente de la función SQLServer SCOPE_IDENTITY() en mySQL?
- 15. SqlServer create table with MySql like auto_increment primary key
- 16. ¿Cuál es la diferencia entre Scope_Identity(), Identity(), @@ Identity e Ident_Current()?
- 17. Interbloqueo SQLServer
- 18. MySQL vs Firebird vs SQLite
- 19. T-Sql @@ Identity
- 20. MySQL ¿Cómo recupero el ID de LAST_INSERT_ID cuando uso INSERT IGNORE INTO?
- 21. MySQL Workbench vs phpMyAdmin
- 22. couchdb vs mysql speed
- 23. CSV vs MySQL rendimiento
- 24. MySQL: Curdate() vs Now()
- 25. MYSQL TINYBLOB vs LONGBLOB
- 26. MySQL COMO vs LOCALIZAR
- 27. MySQL: bigint Vs int
- 28. MongoDB vs MySQL
- 29. MySQL - InnoDB vs MyISAM
- 30. MySQL - length() vs char_length()
@@ 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
@feihtthief - thx, buena aclaración +1 – codemonkey
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