2010-11-26 9 views
11

¿Es posible reutilizar un valor de campo de identidad después de eliminar filas en SQL Server 2008 Express? Aquí hay un ejemplo. Supongamos que tengo una tabla con un campo Id como clave principal (identidad). Si agrego cinco filas, tendré estos 5 Id: 1, 2, 3, 4, 5. Si tuviera que eliminar estas filas, y luego agregar cinco más, las nuevas filas tendrían Id: 6, 7, 8, 9, 10. ¿Es posible dejar que comience nuevamente en 1?Reutilizar el valor de identidad después de eliminar las filas

¿Debo eliminar datos de otra tabla para lograr esto? Gracias por tu ayuda.

+0

¿Te refieres al campo de identidad? La clave principal para casi todas mis tablas es ID y normalmente es (aunque no exclusivamente) un campo de identidad – Murph

+0

Sí, quise decir un campo de identidad. – Jeremy

+3

El hecho de que haya una manera de hacerlo no significa que deba hacerlo. – JeffO

Respuesta

20

Puede utilizar el siguiente para establecer el valor de identidad:

DBCC CHECKIDENT (orders, RESEED, 999) 

Eso significa que tendrá que ejecutar la instrucción sobre la base de todos los BORRAR. Eso debería comenzar a destacar por qué esta es una mala idea ...

A la base de datos no le importan los valores secuenciales, solo para presentación.

+0

Si desea insertar una fila con la ID 10, debe resembrar con la ID 9. Suponiendo que el incremento es 1. – Gomibushi

+1

También puede usar esto para averiguar su valor inicial actual: seleccione ident_current ('table_name') como current_identity – Nathan

5

identity Los campos no reutilizan los valores anteriores de forma predeterminada. Puede resembrarlos con dbcc checkident, pero esto no se sugiere ya que obtendrá infracciones de clave si resiembra debajo de un valor que todavía existe en la tabla. En general, no debería importar cuáles son los valores PK. El hecho de que no sean contiguos no duele nada.

+1

El hecho de que no sean continuos realmente duele algo, porque los valores eliminados no se vuelven a usar. Dado que una columna de identidad de 32 bits estaría limitada a un máximo de 2^32 (o 2^31 si se excluyen los valores negativos) inserta y elimina, después de lo cual las inserciones causarían un error de desbordamiento. Es esencialmente un tipo de pérdida de recursos. Hice algunos cálculos y determiné que una columna de identidad de 32 bits no es a prueba de futuro, e incluso una columna de 64 bits puede no ser suficiente, ya que una computadora 1000 veces más rápida que mi computadora de escritorio podría consumir los valores en Menos de un año. Entonces GUID de 128 bits FTW. – Triynko

+1

Usando un bigint como la columna de identidad obtiene 2^63 - 1 filas. Eso es 9 trillones de filas. Incluso en un trillón de insertos por día, esto todavía te durará 25,000 años. – Aaroninus

9

Si desea restablecer la identidad después de eliminar todos los filas a continuación, hacer una de estas

--instead of delete, resets identity value 
TRUNCATE TABLE orders 

--or if TRUNCATE fails because of FKs, use this after DELETE 
DBCC CHECKIDENT (orders, RESEED, 1) 

De lo contrario, el valor interno no debería importar si lagunas o no.

Cuestiones relacionadas