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
Respuesta
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.
Me di cuenta. Es:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
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.
No lo usaré todo el tiempo y solo en una prueba db. – jumbojs
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
"DBCC CHECKIDENT (table_name)" hace lo mismo (posible sin condiciones de carrera) – user1027167
@ 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
La mejor respuesta sistemática y automática. ¡Bravo! –
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
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.
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)
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.
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.
- 1. SQL Azure Restablecer autoincrement
- 2. ¿Restablecer autoincrement ID? phpmyadmin
- 3. Restablecer columna Identity en SQL Server
- 4. SQL Server - restablecer el campo de identidad
- 5. Límite superior para clave primaria autoincrement en SQL Server
- 6. Autoincrement de índice para Microsoft SQL Server 2008 R2
- 7. Optimizar Eliminar en SQL Server
- 8. Eliminar filas "duplicadas" en SQL Server 2010
- 9. Cómo eliminar el desencadenador en SQL Server?
- 10. ¿Eliminar registros duplicados en SQL Server?
- 11. Eliminar todas las vistas desde SQL Server
- 12. SQL Server gatillo conmutador Insertar, eliminar, actualizar
- 13. SQL Server 2008 - Agregue la cuenta de Windows después de eliminar el usuario predeterminado
- 14. ¿Cómo puedo restablecer un número de secuencia de autoincrement en sqlite
- 15. SQL Servidor sustituir, eliminar todo después de cierto carácter
- 16. Eliminar un grupo de tablas en SQL Server
- 17. Campos de AutoIncrement en bases de datos sin campo de autoincrement
- 18. SQL en SQL Server
- 19. Cómo restablecer el valor de inicio de una identidad de incremento en SQL Server
- 20. Rama anónima después de hacer restablecer git
- 21. eliminar/restablecer css heredado de un elemento
- 22. ELIMINAR instrucción se bloquea en SQL Server sin motivo aparente
- 23. ¿Cómo puedo eliminar citas iniciales y finales en SQL Server?
- 24. Cómo puedo restablecer el nombre de usuario y la contraseña para SQL Server 2008
- 25. ¿Cómo eliminar objetos de soporte de diagramas de SQL Server?
- 26. Cómo borrar, eliminar o restablecer el estado de validación de formulario HTML5 después de "setCustomValidity (" ... ");"?
- 27. Restablecimiento Autoincrement en Android SQLite
- 28. SQL Server: ¿Las operaciones físicas se retrotraen después de ROLLBACK?
- 29. SQL Server Management Studio falta después de 2008 R2 Install
- 30. Eliminar registros de SQL Server 2005 sin iniciar sesión
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. –
@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