Informix: cómo obtener un ID del último registro insertado
Pregunta
¿Cuál es la forma más eficiente de obtener el valor de la columna SERIAL después de la instrucción INSERT? Es decir. Estoy buscando una manera de replicar la funcionalidad @@ IDENTITY
o SCOPE_IDENTITY
de MS SQL
Solución
El valor de la última inserción de SERIE se almacena en el registro SQLCA, como la segunda entrada en la matriz sqlerrd. La respuesta de Brian es correcta para ESQL / C, pero no ha mencionado el idioma que está utilizando.
Si está escribiendo un procedimiento almacenado, el valor se puede encontrar de la siguiente manera:
LET new_id = DBINFO('sqlca.sqlerrd1');
También se puede encontrar en $ sth- > {ix_sqlerrd} [1]
si usa DBI
Existen variantes para otros idiomas / interfaces, pero estoy seguro de que obtendrás la idea.
Otros consejos
He visto esto usado.
if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
Result := -(Abs(LOCAL_SQLCA^.sqlcode));
No creo que " eficiente " es la palabra que estás buscando aquí. Es más una cuestión de exactitud. No estoy seguro de poder explicarlo mejor que los Libros en pantalla de SQL, pero en general, a menos que realmente sepa lo que está haciendo y tenga una razón específica para usar @@ IDENTITY, use SCOPE_IDENTITY. La razón más obvia para esto es que @@ IDENTITY no devolverá la identidad del último registro agregado por su programa / sp / etc si hay un activador adjunto a la tabla. Además, podría haber problemas en aplicaciones de alto volumen en las que se produzcan dos transacciones al mismo tiempo y ocurra lo siguiente ...
- Su inserción
- inserción de otro usuario
- Devolverle la identidad de otro usuario
El OP no especificó qué versión de Informix se está utilizando, por lo que puede haber diferentes respuestas