identidad - Restablecer AutoIncrement en SQL Server después de eliminar
reset contador sql server (10)
Basado en la respuesta aceptada, para aquellos que encontraron un problema similar, con calificación de esquema completo:
( [MyDataBase].[MySchemaName].[MyTable]
) ... resulta en un error, debe estar en el contexto de esa base de datos
Es decir, lo siguiente arrojará un error:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Incluya el nombre de la tabla completamente calificado con comillas simples en su lugar:
DBCC CHECKIDENT (''[MyDataBase].[MySchemaName].[MyTable]'', RESEED, 0)
He eliminado algunos registros de una tabla en una base de datos de SQL Server. Ahora los ID pasan de 101 a 1200. Quiero eliminar los registros nuevamente, pero quiero que los ID vuelvan a 102. ¿Hay alguna forma de hacerlo en SQL Server?
Ejecute el siguiente comando para reiniciar mytable para comenzar en 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Lea sobre esto en los Libros en Línea (BOL, ayuda de SQL). También tenga cuidado de no tener registros más altos que la semilla que está configurando.
Eliminar y revisó todas las tablas en una base de datos.
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable ''DBCC CHECKIDENT(''''?'''', RESEED, 0)'' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
Me lo imaginé. Sus:
DBCC CHECKIDENT (''tablename'', RESEED, newseed)
No quieres hacer esto en general. Reseed puede crear problemas de integridad de datos. Realmente es solo para uso en sistemas de desarrollo donde está borrando todos los datos de prueba y volviendo a empezar. No se debe utilizar en un sistema de producción en caso de que no se hayan eliminado todos los registros relacionados (¡no todas las tablas que deberían estar en una relación de clave externa!). Puede crear un desastre haciendo esto y especialmente si quiere hacerlo regularmente después de cada eliminación. Es una mala idea preocuparse por las brechas en los valores de su campo de identidad.
Prueba esto:
ALTER TABLE tablename AUTO_INCREMENT = 1
Quiero agregar esta respuesta porque el DBCC CHECKIDENT
producirá problemas cuando use esquemas para tablas. Use esto para estar seguro:
DECLARE @Table AS NVARCHAR(500) = ''myschema.mytable'';
DBCC CHECKIDENT (@Table, RESEED, 0);
Si desea comprobar el éxito de la operación, utilice
SELECT IDENT_CURRENT(@Table);
que debería dar salida a 0
en el ejemplo anterior.
Varias respuestas recomiendan el uso de una declaración como esta:
DBCC CHECKIDENT (mytable, RESEED, 0)
Pero el OP dijo "eliminó algunos registros", que puede que no sean todos, por lo que un valor de 0 no siempre es el correcto. Otra respuesta sugirió que se encuentre automáticamente el valor actual máximo y que se reinicie a ese valor, pero que se encuentre en problemas si no hay registros en la tabla y, por lo tanto, max () devolverá NULL. Un comentario sugirió usar simplemente
DBCC CHECKIDENT (mytable)
para restablecer el valor, pero otro comentario indicó correctamente que esto solo aumenta el valor al máximo que ya está en la tabla; esto no reducirá el valor si ya es más alto que el máximo en la tabla, que es lo que quería hacer el OP.
Una mejor solución combina estas ideas. El primer CHECKIDENT restablece el valor a 0, y el segundo lo restablece al valor más alto actualmente en la tabla, en caso de que haya registros en la tabla:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Como han indicado varios comentarios, asegúrese de que no haya claves foráneas en otras tablas que apunten a los registros eliminados. De lo contrario, esas claves externas apuntarán a los registros que cree después de volver a sembrar la tabla, lo cual es casi seguro que no es lo que tenía en mente.
a prueba de idiotas
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
DBCC CHECKIDENT(''databasename.dbo.tablename'', RESEED, number)
si número = 0, en la siguiente inserción el campo de incremento automático contendrá el valor 1
Si número = 101, en la siguiente inserción el campo de incremento automático contendrá el valor 102
Alguna información adicional ... Puede ser útil para usted
Antes de dar el number
incremento automático en la consulta anterior, debe asegurarse de que la columna de incremento automático de su tabla existente contenga valores menos ese number
.
Para obtener el valor máximo de una columna (nombre_columna) de una tabla (tabla1), puede usar la siguiente consulta
SELECT MAX(column_name) FROM table1