Ver Mensaje Individual
  #19  
Antiguo 17-06-2020
fduron.mx fduron.mx is offline
Registrado
 
Registrado: jun 2020
Posts: 1
Reputación: 0
fduron.mx Va por buen camino
Firebird 3.0 Generalidades de las columnas tipo IDENTITY

En firebird 3.0 se introdujo el uso de las columnas tipo IDENTITY, este tipo de campos producen identificadores únicos en la columna declarada utilizando un generador interno; para soportar este tipo de columnas se han agregado un par de campos a la tabla RDB$RELATION_FIELDS:
  • RDB$GENERATOR_NAME (almacena el nombre del generador que se ha creado automáticamente en RDB$GENERATORS)
  • RDB$IDENTITY_TYPE (almacena un 0 para las columnas definidas como IDENTITY y NULL para las demás)
Hasta el momento la única manera de obtener el valor actual de un generador, es a través de la la función GEN_ID(<nombreDelGenerador>, 0) no entraré en detalles en el uso de esta función.

Ahora bien, al momento de declarar una columna de tipo IDENTITY no es necesario crear el disparador, tampoco creamos un generador por nuestra cuenta, todo esto se realiza internamente por el motor de Firebird 3. Sin embargo, el generador existe, y para obtener el valor actual del generador que le fue asignado a nuestro columna, primero debemos averiguar que nombre le ha puesto Firebird a dicho generador, para lo cual, realizamos una consulta a la tabla RDB$RELATION_FIELDS de la siguiente manera:
Código SQL [-]
select rdb$generator_name

from rdb$relation_fields

where rdb$relation_name = 'TABLA_X'
and rdb$field_name = 'ID'
El resultado de esta consulta nos arrojará el nombre del generador que se le ha asignado a la columna ID en la tabla TABLA_X (supongamos que el resultado fue RDB$3), enseguida solo resta ejecutar las instrucciones ya conocidas para el manejo e incremento de generadores:


Para obtener el valor actual del generador
usando instrucciones SQL:

Código SQL [-]
 select GEN_ID(RDB$3, 0) from RDB$DATABASE
Desde Delphi:

Código Delphi [-]
FDQuery1.Connection.GetLastAutoGenValue('RDB$3');


Para obtener el siguiente valor del generador
Código SQL [-]
 select NEXT VALUE FOR RDB$3 from RDB$DATABASE

A partir de Firebird 2.0 se recomienda usar NEXT VALUE FOR en lugar de GEN_ID(<NombreGenerador>, <Incremento>) a menos que se desee incrementar el generador en un valor diferente a 1

Finalmente, una vez que hemos identificado el nombre del generador de nuestra columna IDENTITY podemos obtener el valor del generador mientras se ejecuta la sentencia INSERT, por ejemplo:

Código SQL [-]
insert into tabla
(id, campo)
values
(next value for RDB$3, 'prueba')
 returning id


Desde delphi usando las propiedades del componente FDQuery
Código Delphi [-]
FDQuery1.UpdateOptions.AutoIncFields := 'ID';
FDQuery1.UpdateOptions.FetchGeneratorsPoint := gpImmediate;
FDQuery1.UpdateOptions.GeneratorName := 'RDB$3';

gpImmediate incrementa en 1 el valor del generador RDB$3 justo en el momento en el que se inserta un nuevo registro en la tabla, y le asigna el valor obtenido al campo ID, sin la necesidad de incluir la instrucción NEXT VALUE FOR en la sentencia SQL
Responder Con Cita