2009-02-04 34 views
199

He eliminado algunos registros de una tabla en una base de datos de SQL Server. Ahora las ID van de 101 a 1200. Quiero eliminar los registros nuevamente, pero quiero que los ID vuelvan a 102. ¿Hay alguna manera de hacerlo en SQL Server?Restablecer AutoIncrement en SQL Server después de Eliminar

+33

Por favor, no diga "No lo hagas". Odio cuando le pregunto cómo hacer algo y todo lo que consigo es no hacerlo. Sí, restablecer la identidad puede causar problemas con la clave externa, pero solo si no conoce su base de datos y su programa en consecuencia. Hay muy buenas razones para restablecer una identidad después de una eliminación visualizada: se llaman Auditores. Los auditores odian ver las brechas así que llénelas, hágalo de una manera controlada y asegúrese de que se mantengan las contraseñas de claves extranjeras. –

+6

@spyder, ¿sabía que tendrá lagunas si se retrotrae un inserto de registro no solo para eliminarlo? No puede evitar las brechas con un autoincrement y es una tontería intentarlo. He trabajado para una agencia de auditoría y los auditores competentes pueden explicarles esto. Además, si tiene tablas de auditoría adecuadas, pueden ver qué sucedió con esos registros. O si no debe haber lagunas alguna vez por razones legales (hay algunos casos de esto), entonces solo un desarrollador incompetente usaría una autoincrementación y los auditores están justamente molestos. – HLGEM

Respuesta

348

Emita el mandato siguiente para reinicializar mitabla comenzar en 1:

DBCC CHECKIDENT (mytable, RESEED, 0) 

leído en los libros en línea (BOL, ayuda SQL). También tenga cuidado de no tener registros más altos que la semilla que está configurando.

+3

... porque los identificadores de estos registros se reutilizarán felizmente, causando un desastre. – nalply

+0

¿qué tal un cero? – Joset

+3

En realidad, para iniciar ID en 1, necesita usar 0: 'DBCC CHECKIDENT (mytable, RESEED, 0)' –

3

Me di cuenta. Es:

DBCC CHECKIDENT ('tablename', RESEED, newseed) 
2

No desea hacer esto en general. Reseed puede crear problemas de integridad de datos. En realidad, es solo para uso en sistemas de desarrollo donde está borrando todos los datos de prueba y comenzando de nuevo. No debe usarse 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 son!). Puede crear un lío haciendo esto y especialmente si tiene la intención de hacerlo regularmente después de cada eliminación. Es una mala idea preocuparse por las lagunas en sus valores de campo de identidad.

+6

No lo usaré todo el tiempo y solo en una prueba db. – jumbojs

29

semi idiota a prueba:

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

+1

"DBCC CHECKIDENT (table_name)" hace lo mismo (posible sin condiciones de carrera) – user1027167

+2

@ user1027167 Los documentos dicen 'si el valor de identidad actual para una tabla es menor que el valor de identidad máximo almacenado en la columna de identidad'; eso no cubre la limpieza después de que se borran los datos (volver a usar los ID's, a menudo una mala idea). Verificado en SQL 2008 – user423430

+1

La mejor respuesta sistemática y automática. ¡Bravo! –

63
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number) 

si el número = 0 entonces en la siguiente insertar el campo de incremento automático contendrá valor 1

si el número = 101 entonces en la siguiente inserción, el campo de incremento automático contendrá el valor 102


Alguna información adicional ... Puede ser útil para que

Antes de dar incremento automático number en consulta anterior, usted tiene que asegurarse de que la columna de incremento automático de la tabla existente contiene valores menores que number.

para obtener el valor máximo de una columna (nombre_columna) de una tabla (tabla 1), se puede utilizar siguiente consulta

SELECT MAX(column_name) FROM table1 
7

Prueba esto:

ALTER TABLE tablename AUTO_INCREMENT = 1 
+4

Si no estoy equivocado, la respuesta es buena para mysql sin embargo. – Carol

+1

Esta es una respuesta para MySQL. OP pregunta por MSSQL. – reformed

5

Eliminar y Resiembre 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. 
4

Sobre la base de la respuesta aceptada, para los que se encontró con un problema similar, con la calificación de esquema completo:

([MyDataBase].[MySchemaName].[MyTable]) ...resulta en un error, tiene que ser en el contexto de que DB

Es decir, la siguiente generará un error:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0) 

Incluya el nombre de tabla totalmente calificado con comillas simples en su lugar:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0) 
2

Varias respuestas recomiendan el uso de una declaración algo como esto:

DBCC CHECKIDENT (mytable, RESEED, 0) 

Pero el OP dijo "borraron algunos registros", que pueden no ser todos, por lo que un valor de 0 no siempre es el correcto. Otra respuesta sugirió que se buscara automáticamente el valor actual máximo y el resembrado a ese, pero eso tiene problemas si no hay registros en la tabla y, por lo tanto, max() devolverá NULL. Un comentario sugirió utilizar simplemente

DBCC CHECKIDENT (mytable) 

para restablecer el valor, pero otro comentario declaró correctamente que esto sólo aumenta el valor al máximo ya 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 el OP quería hacer.

Una mejor solución combina estas ideas. La primera CHECKIDENT restablece el valor a 0, y el segundo, se restaura al valor más alto actualmente en la tabla, en caso de que haya registros de la tabla:

DBCC CHECKIDENT (mytable, RESEED, 0) 
DBCC CHECKIDENT (mytable) 

Como varios comentarios han indicado, asegúrese de que no hay claves externas en otras tablas que apuntan a los registros eliminados. De lo contrario, esas claves foráneas apuntarán a los registros que usted cree después de resembrar la tabla, lo que seguramente no es lo que tenía en mente.

0

Quiero agregar esta respuesta porque el enfoque DBCC CHECKIDENT generará problemas cuando use esquemas para las tablas. Usar 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); 

el cual debe ser la salida 0 en el ejemplo anterior.

Cuestiones relacionadas