He insertado registros en una tabla de base de datos de SQL Server. La tabla tenía una clave principal definida y la semilla de identidad de incremento automático se establece en "Sí". Esto se hace principalmente porque en SQL Azure, cada tabla debe tener una clave primaria e identidad definidas.
Pero como tengo que eliminar algunos registros de la tabla, la semilla de identidad para esas tablas se alterará y la columna de índice (que se genera automáticamente con un incremento de 1) se alterará.
¿Cómo puedo restablecer la columna de identidad después de eliminar los registros para que la columna tenga una secuencia en orden numérico ascendente?
La columna de identidad no se utiliza como clave foránea en ninguna parte de la base de datos.
Respuestas:
El
DBCC CHECKIDENT
comando de gestión se utiliza para restablecer el contador de identidad. La sintaxis del comando es:Ejemplo:
No se admitía en versiones anteriores de Azure SQL Database, pero ahora se admite.
Tenga en cuenta que el
new_reseed_value
argumento varía según las versiones de SQL Server según la documentación :Sin embargo, encuentro que esta información es engañosa (en realidad, simplemente es incorrecta) porque el comportamiento observado indica que al menos SQL Server 2012 todavía usa new_reseed_value + la lógica del valor de incremento actual. Microsoft incluso contradice con el suyo
Example C
encontrado en la misma página:Aún así, todo esto deja una opción para un comportamiento diferente en las versiones más nuevas de SQL Server. Supongo que la única manera de estar seguro, hasta que Microsoft aclare las cosas en su propia documentación, es hacer pruebas reales antes de su uso.
fuente
DBCC CHECKIDENT
es compatible a partir de la próxima versión (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Aunque, para esta situación particular, aún recomendaría TRUNCATE TABLE :)Donde 0 es el
identity
valor inicialfuente
TRUNCATE
, el nuevo valor inicial debe ser el valor para el próximo uso (es decir, 1 no 0). Si la tabla no está vacía, usará elnew_reseed_value + 1
. MSDNDELETE
, noTRUNCATE
, en cuyo caso también lo estánew_reseed+value + 1
. Escribí una publicación sobre esto, mostrando el comportamiento real a través de algunas pruebas, y actualicé el documento real (ahora que podemos debido a que está en GitHub): ¿Cómo funciona realmente DBCC CHECKIDENT al restablecer la semilla de identidad (RESEED)? .Cabe señalar que SI todos los datos se eliminan de la tabla a través de
DELETE
(es decir, sinWHERE
cláusula), siempre que a) los permisos lo permitan, yb) no hay FK que hagan referencia a la tabla (que parece ser el caso aquí),TRUNCATE TABLE
se preferiría el uso, ya que es más eficienteDELETE
y restablece laIDENTITY
semilla al mismo tiempo. Los siguientes detalles se toman de la página de MSDN para TRUNCATE TABLE :Entonces lo siguiente:
Se vuelve justo:
Consulte la
TRUNCATE TABLE
documentación (vinculada anteriormente) para obtener información adicional sobre restricciones, etc.fuente
Aunque la mayoría de las respuestas sugieren RESEED a 0, pero muchas veces necesitamos volver a resetear al siguiente ID disponible
Esto verificará la tabla y se restablecerá a la siguiente ID.
fuente
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Intenté
@anil shahs
responder y restableció la identidad. Pero cuando se insertó una nueva fila, obtuvo elidentity = 2
. Entonces, en cambio, cambié la sintaxis a:Entonces la primera fila obtendrá la identidad = 1.
fuente
Aunque la mayoría de las respuestas están sugiriendo
RESEED
a0
, y mientras algunos ven esto como un defecto deTRUNCATED
tablas, Microsoft tiene una solución que excluye laID
Esto verificará la tabla y se restablecerá a la siguiente
ID
. Esto ha estado disponible desde MS SQL 2005 hasta la actualidad.https://msdn.microsoft.com/en-us/library/ms176057.aspx
fuente
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
pero con nuevas inserciones sigue utilizando la semilla incorrecta.emitir 2 comandos puede hacer el truco
el primero restablece la identidad a cero, y el siguiente lo establecerá en el siguiente valor disponible - jacob
fuente
@jacob
Funcionó para mí, solo tuve que borrar todas las entradas primero de la tabla, luego agregué lo anterior en un punto de activación después de eliminar. Ahora cada vez que borro una entrada se toma desde allí.
fuente
Truncate
Se prefiere la tabla porque borra los registros, restablece el contador y recupera el espacio en disco.Delete
yCheckIdent
debe usarse solo donde las claves externas evitan que se trunque.fuente
Restablecer columna de identidad con nueva identificación ...
fuente
Esta es una pregunta común y la respuesta es siempre la misma: no lo hagas. Los valores de identidad deben tratarse como arbitrarios y, como tal, no existe un orden "correcto".
fuente
Ejecute este script para restablecer la columna de identidad. Deberá hacer dos cambios. Reemplace tableXYZ con cualquier tabla que necesite actualizar. Además, el nombre de la columna de identidad debe eliminarse de la tabla temporal. Esto fue instantáneo en una mesa con 35,000 filas y 3 columnas. Obviamente, haga una copia de seguridad de la tabla y primero intente esto en un entorno de prueba.
fuente
Esto establecerá el valor de identidad actual en 0.
Al insertar el siguiente valor, el valor de identidad se incrementa a 1.
fuente
Use este procedimiento almacenado:
Solo revisando mi respuesta. Me encontré con un comportamiento extraño en SQL Server 2008 R2 que debe tener en cuenta.
La primera selección produce
0, Item 1
.El segundo produce
1, Item 1
. Si ejecuta el reinicio justo después de crear la tabla, el siguiente valor es 0. Honestamente, no me sorprende que Microsoft no pueda hacer esto correctamente. Lo descubrí porque tengo un archivo de script que llena las tablas de referencia que a veces ejecuto después de volver a crear tablas y, a veces, cuando las tablas ya están creadas.fuente
Yo uso el siguiente script para hacer esto. Solo hay un escenario en el que producirá un "error", que es si ha eliminado todas las filas de la tabla, y
IDENT_CURRENT
actualmente está configurado en 1, es decir, solo había una fila en la tabla para comenzar.fuente
Para completar las filas DELETE y restablecer el recuento de IDENTIDAD, lo uso (SQL Server 2008 R2)
fuente
Restablecer a 0 no es muy práctico a menos que esté limpiando la tabla como un todo.
de lo contrario, la respuesta dada por Anthony Raymond es perfecta. Obtenga el máximo de la columna de identidad primero, luego siembre con max.
fuente
He estado tratando de hacer esto para una gran cantidad de tablas durante el desarrollo, y esto funciona de maravilla.
Entonces, primero lo fuerza a establecerse en 1, luego lo establece en el índice más alto de las filas presentes en la tabla. Descanso rápido y fácil del idex.
fuente
Siempre es mejor usar TRUNCATE cuando sea posible en lugar de eliminar todos los registros, ya que tampoco usa espacio de registro.
En caso de que necesitemos eliminar y restablecer la semilla, recuerde siempre que si la tabla nunca se rellenó y usó
DBCC CHECKIDENT('tablenem',RESEED,0)
, el primer registro obtendrá identidad = 0 como se indica en la documentación de msdnfuente
TRUNCATE
evitaría que seROLLBACK
comportara como se esperaba? ROLLBACK todavía retrocede. Incluso si el DB está configurado enBULK_LOGGED
.Primero: Especificación de identidad Solo: "No" >> Guardar base de datos Ejecutar proyecto
Después de eso: Especificación de identidad Solo: "SÍ" >> Guardar base de datos Ejecutar proyecto
Su ID de base de datos, PK Comience desde 1 >>
fuente