2011-12-23 13 views
5

Tengo cosas en mi proyecto en las que necesito mostrar la siguiente clave principal en el campo sin insertar el registro físicamente?cómo saber el valor de la siguiente clave principal de la tabla sin insertar el registro en el servidor sql?

¿Cómo puedo saber el siguiente valor de la clave principal sin insertar el registro?

es decir, Permite tener 10 registros con columnas de ID como clave principal. Ahora borré el décimo registro, por lo que el siguiente valor será 11.

Quiero saber el valor de la próxima clave primaria (11 en mi caso) sin insertar el registro físicamente en la tabla.

En resumen, el próximo valor futuro de la clave principal.

¿Cómo puedo obtener eso?

Proporcione la solución.

+0

encontré la solución. –

+0

Vea que es posible obtener el siguiente valor sin insertar un registro físico. –

+0

que ** NO ** es una solución válida. Puede consultar el valor ** ACTUAL **, pero eso no significa ** NINGUNA GARANTÍA ** cuál será el siguiente valor ... –

Respuesta

8

EDITAR (Muy importante)

Hay que señalar que este método puede ser usado para predecir el siguiente ID, pero no garantiza este valor. El motivo es que @marc_s se mencionó en los comentarios, que entre el momento en que solicitó el valor y el momento en que lo usó, podría haberse insertado otra transacción en esta tabla, haciendo que la asunción del valor recuperado sea nula e inválida.

Como se mencionó, si su implementación se basa en tal suposición, ha cometido algunos errores de diseño, y debería considerar volver a trabajar esta solución como primera prioridad.

De IDENT_CURRENT (Transact-SQL)

Devuelve el último valor de identidad generado para una tabla o vista . El último valor de identidad generado puede ser para cualquier sesión y cualquier ámbito .

Tenga una mirada en el ejemplo siguiente

CREATE TABLE #Table (
     ID INT IDENTITY(1,1), 
     Val INT 
) 

INSERT INTO #Table SELECT 1 
INSERT INTO #Table SELECT 2 
INSERT INTO #Table SELECT 3 

SELECT * FROM #Table 

DELETE FROM #Table WHERE ID >= 2 

SELECT * FROM #Table 

SELECT IDENT_CURRENT('#Table') 

DROP TABLE #Table 
+0

Esto puede darle el valor ** actual ** - pero lo hace * * no hay garantía ** en cuanto a cuál será el valor ** NEXT ** .... –

+0

@marc_s esto le da la última identidad utilizada para esa tabla, por lo que la siguiente dependerá de qué intervalo de identidad es, que normalmente es 1 , entonces el próximo sería ese +1, ¿piensa? –

+1

Bueno, antes que nada, una IDENTIDAD no siempre se incrementa en 1; podría ser otra cosa. Incluso si toma eso en cuenta - no hay ** garantía ** de que obtendrá ese valor - otra transacción podría insertar una fila entre el momento en que consulta el IDENT_CURRENT y el momento en que se inserta la fila. Simplemente ** no existe una forma confiable ** de conocer el siguiente valor de IDENTIDAD antes de tiempo. –

3

Lo que estás preguntando realmente no tiene sentido. Las bases de datos están diseñadas para admitir el acceso múltiple, por lo que incluso si hubiera una forma de determinar la siguiente identidad de clave principal sin insertar un registro, no habría ninguna garantía de que otra conexión no escribiría en esa tabla y reclamaría dicha identidad antes de que finalice su próxima transacción. Y si estás pensando "Bueno, yo podría mantenerlo a raya", básicamente has eliminado cualquier tipo de situación plausible en la que saber la clave de identidad futura pueda ayudarte.

Entonces, ¿cuál es su razonamiento para querer la futura clave de identidad?

1

Con la versión actual de SQL Server (2008 R2) y utilizando el mecanismo IDENTITY, NO PUEDE conocer el siguiente valor antes de tiempo. Hay no forma correcta y garantizada de conocer el siguiente valor hasta que haya insertado la fila; solo entonces, cuando la fila se almacena dentro de la tabla, ese valor se determina y se devuelve.

SQL Server 2012 ("Denali") tendrá SEQUENCES que es casi lo mismo que IDENTITY columnas - pero independiente, y con secuencias, se puede pedir el siguiente valor (y luego usarlo)

leer más acerca de las secuencias:

0

seleccione ID ENT_CURRENT ('usuarios')

seleccione IDENT_CURRENT ('nombre de la tabla')

+0

Esto le da el valor ** ACTUAL **, pero eso sí le dice con certeza cuál será el ** VALOR PRÓXIMO ** ...... –

+0

No, tendremos que conseguirlo solo con +1, seguro –

+0

, tiene razón cuando hay una gran aplicación y hace inserción desde muchos navegadores del cliente, lo siento mencionar pero estoy teniendo muy pequeño –

0

No es realmente una gran idea, pero si quieres una clave principal garantizada mi sugerencia sería la de insertar un registro ficticio temporal y obtener su clave primaria y a continuación, cambie el registro utilizando ACTUALIZAR cuando se haya cometido el registro o BORRE el registro si el usuario cancela la inserción. De cualquier manera, es mejor que usar una llave imaginaria.

Cuestiones relacionadas