Pregunta

En Interbase (estoy usando 2007, no sé si es importante) hay un comando para obtener la identidad de un registro recién insertado, similar a SCOPE_IDENTITY () en SQL Server?

¿Fue útil?

Solución

No, InterBase no tiene realmente una característica de identidad.

¿Qué tiene InterBase, en cambio, es una característica del generador. Los generadores son algo así como la identidad, sino que están separados lógicamente de la columna de clave principal. Un generador, es decir, se le da un valor único garantizado, sino lo que haces con ese valor depende de usted.

Se podría utilizar ese valor como los valores de clave principal para una sola tabla o de varias tablas. Pero en realidad la asignación del valor de clave principal es algo que debe hacer usted mismo.

Además de no tener una función como SCOPE_IDENTITY, InterBase no tiene ningún tipo de función para devolver valores de un comunicado INSERT. Así que no sólo no se puede obtener una copia de valor de clave primaria generada a partir de una declaración INSERT, también no puede conseguir cualquier otro valor, como los valores establecidos por un disparador.

Soluciones provisionales

Una posible solución para esto es para generar el valor de la clave primaria de antemano. Por lo que podría hacer algo como lo siguiente (Voy a usar la sintaxis interbase almacenado procedimiento de este ejemplo, ya no sé lo que la programación de idioma que está utilizando, pero se puede hacer lo mismo en cualquier lenguaje de programación):

DECLARE VARIABLE ID INTEGER;
BEGIN
    ID = SELECT GEN_ID(MY_GENERATOR, 1) FROM RDB$DATABASE;
    INSERT INTO MY_TABLE (ID, DESCRIPTION) VALUES (:ID, "Foo");

RDB$DATABASE es una tabla del sistema que tiene sólo un registro. Conocer el valor de ID, puede volverlo a partir de la proc.

Una segunda solución consiste en SELECT el registro utilizando una clave alternativa y leer el ID generado de esa manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top