2010-03-16 14 views
5

Estoy usando DB2 v9 en LUW.¿Cómo obtengo el siguiente valor que se utilizará en una columna de IDENTIDAD?

tengo una columna definida como esto:

"ID" BIGINT NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20,
NO MINVALUE, NO MAXVALUE, NO CYCLE, NO ORDER),

me gustaría saber la mejor manera de determinar cuál es el valor que sigue a la columna ID próxima vez que se inserta un registro en la tabla .

Usaré esta información para escribir una secuencia de comandos para hacer una verificación de "cordura" en la tabla de que la IDENTIDAD aún está intacta y que su siguiente valor es uno mayor que el valor más alto en la columna ID.

No quiero simplemente restablecer el valor a ciegas. Si la mesa no pasa el control de cordura, quiero que me notifiquen para poder determinar qué está causando que la IDENTIDAD "despierte".

+0

Esto es para realizar una prueba fuera de línea mientras no se utiliza la base de datos. No hay problemas con las personas que insertan eliminar registros mientras la prueba se está ejecutando. –

Respuesta

1

No puede determinar la siguiente identidad. Incluso si pudiera correr el riesgo de que los datos no estén sincronizados para cuando intente crear un nuevo registro. Lo único que debe hacer es crear un nuevo registro y obtener la nueva identidad, realizar su verificación y luego actualizar el registro con el resto de los datos.

Puede usar SELECT IDENT_CURRENT ('yourtablename') para obtener el último generado. Esto tiene la misma advertencia que el anterior. Eso funciona en T-SQL, no estoy seguro en el sabor de DB2.

+0

No creo que la identidad anterior funcione, porque en el caso de una nueva carga puede que no haya habido una identidad previa. ¿A menos que un reseed también establezca una identidad previa? –

+0

Su idea de crear un nuevo registro podría funcionar. Aunque no quiero llenar el registro. Esto es solo un cheque y no está involucrado en la creación de registros. Podría crear un nuevo registro, obtener el valor de la columna de identificación y luego realizar una reversión. ¿Alguien sabe si realizar una reversión también revierte el valor de la semilla? Preferiría no tener un incremento de valor inicial cada vez que ejecute la prueba. –

+0

Este es el camino a seguir. No te preocupes por las lagunas. Incluso con un entero de 32 bits sin signo, puede insertar 1000 filas por segundo, 24 horas al día, durante 136 años antes de quedarse sin nada. –

1

No creo que esto funcione como usted espera. Considere el caso donde se inserta una fila, luego, antes de insertar otra fila, esa fila se elimina. En ese punto, la identificación autogenerada será (al menos) 2 mayor que el valor más alto en la base de datos Y será correcta. Si puede garantizar que no se produzcan eliminaciones, podría funcionar, pero no estoy seguro de qué uso sería.

Básicamente, está comprobando si las operaciones básicas del software DB están funcionando y, si no lo están, ¿qué va a hacer? ¿Cambiar vendedores?

Si el caso es que simplemente desea resembrar la columna de identidad, haga una selección max (id) y vuelva a colocar la columna dentro de la misma transacción. Puede estar seguro de que no se insertan nuevos registros mientras la columna se está volviendo a sembrar forzando la semántica de transacción de nivel de aislamiento serializable.

+0

No estoy comprobando si las operaciones básicas de DB2 están funcionando. Un ejemplo de lo que podría atrapar es una operación de carga ejecutada incorrectamente. Puedo ejecutar mi script todos los días antes del comienzo de los negocios.Si encuentro un problema, puedo rastrear quién/qué estaba cambiando la tabla afectada y tener una discusión sobre la forma correcta de cargar datos. Me complacerá recibir algunos falsos positivos para el caso de que se eliminen los datos. Si obtengo demasiados falsos positivos, puedo probar un rango mayor que 1. –

+0

@Michael, entonces lo que está diciendo es que alguien podría activar el inserto de identidad, y luego olvida resembrar la columna para establecerla más alta que la última Identificación que insertaron después? Puede probar esto simplemente leyendo el valor de identificación máxima, haciendo una inserción con datos "válidos", verificando si tiene éxito o falla y tiene una identificación mayor que la que observó, luego borre esa fila, todo dentro de una sola transacción. Esto introduciría algunos identificadores "vacíos" en la secuencia, pero detectaría el tipo de problema que he descrito. – tvanfosson

+0

Sí, ese es el tipo de problema que intento atrapar. Espero que alguien tenga una solución que no cree ID vacías. No sería el fin del mundo si terminara con una identificación vacía cada vez que ejecutara el script, pero lo ideal sería evitarlo. –

0

Si la columna de ID está configurada como GENERADA POR SIEMPRE, no tendría problemas con la carga/importación incorrecta. Además, la función IDENTITY_VAL_LOCAL se puede usar para obtener el valor de identidad.
Más información sobre esta función here

Cuestiones relacionadas