2010-05-08 13 views
5

hey all. Tengo una tabla en mi base de datos que tiene alrededor de mil registros. Me gustaría restablecer la columna de identidad para que todos los ID sean secuenciales de nuevo. Estaba buscando en this pero estoy suponiendo que sólo funciona en una mesa vacíaSQL Reset Identity ID en la tabla ya poblada

Tabla actual

ID | Name 
1   Joe 
2   Phil 
5   Jan 
88   Rob 

tabla deseada

ID | Name 
1   Joe 
2   Phil 
3   Jan 
4   Rob 

Gracias de antemano

+0

¿Su columna de identidad se usa como clave foránea en otro lugar? – uhleeka

+0

no, es simplemente único porque hay otro campo en la tabla que lo hace referencia. –

+0

IE: 'ID | ParentID | Nombre' –

Respuesta

5

La forma más fácil sería hacer una copia de la tabla actual, reparar cualquier problema parentid, dejarlo caer y luego cambiar el nombre de la nueva.

También puede quitar temporalmente el IDENTITY y tratar el folowing:

;WITH TBL AS 
(
    SELECT *, ROW_NUMBER(ORDER BY ID) AS RN 
    FROM CURRENT_TABLE 
) 
UPDATE TBL 
SET ID = RN 

O bien, si no se preocupan por el orden de los registros, este

DECLARE INT @id; 
SET @id = 0; 

UPDATE CURRENT_TABLE 
SET @id = ID = @id + 1; 
-2

Uso DBCC CHECKIDENT. la mesa no tiene que estar vacío:

  • DBCC CHECKIDENT (table_name, NORESEED)

valor de identidad actual no se restablece. DBCC CHECKIDENT devuelve el valor de identidad actual y el valor máximo actual de la columna de identidad. Si los dos valores no son los mismos, debe restablecer el valor de identidad a para evitar posibles errores o lagunas en la secuencia de valores .

  • DBCC CHECKIDENT (table_name) o DBCC CHECKIDENT (table_name, RESEED)

Si el valor de identidad actual de una tabla es menor que el valor máximo identidad almacenada en la columna de identidad , se restablece con el valor máximo en la identidad columna.

  • DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)

valor de identidad actual se establece en el new_reseed_value. Si no hay filas han sido inserta en la tabla desde la creación de la tabla , o si todas las filas han sido eliminado mediante la instrucción TRUNCATE TABLE , la primera fila inserta después de ejecutar DBCC CHECKIDENT utiliza new_reseed_value como la identidad. De lo contrario, la siguiente fila insertada usa new_reseed_value + el valor de incremento actual.

Si la tabla no está vacía, estableciendo el valor identidad a un número menor que el valor máximo en la identidad columna puede dar lugar a una de las siguientes condiciones:

  • Si un PRIMARIA Existe una restricción KEY o UNIQUE en la columna de identidad , el mensaje de error 2627 será generado en las operaciones de inserción posteriores en la tabla porque el valor de identidad generado entrará en conflicto con existente valores.

  • Si no existe una restricción PRIMARY KEY o UNIQUE, después operaciones de inserción se traducirá en valores de identidad duplicadas.

+0

Esto de hecho no funciona. Como dice el artículo, si ejecuto 'DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)', entonces no puedo insertar nuevos registros donde están actualmente los registros anteriores. Parece que la única forma de hacerlo correctamente es insertar los datos en una nueva tabla (recreando los ID), soltar la tabla anterior y luego cambiar el nombre de la nueva tabla al nombre de la tabla anterior. –

+0

Esto cambiará el siguiente valor inicial de inserción de la identidad; no actualizar los valores de identidad existentes. –

1

solución rápida sería a:

  1. crear una nueva tabla con el mismo esquema
  2. copiar la tabla antigua a la nueva (excepto para la columna de identidad)
  3. eliminar la vieja mesa de
  4. cambiar el nombre de la nueva tabla
1

Debido a que tiene las claves externas en la misma mesa (por su comentario), deberá conservar el mapeo de antiguo a nuevo en alguna parte y volver a instalar las claves foráneas para que coincidan con las nuevas identidades.

Existen varios métodos para hacerlo, pero me gustaría cuestionar la necesidad de actualizar sus claves principales, especialmente porque ya tiene claves externas que hacen referencia a ellas, y es solo una clave sustituta. No es como si estuviera cambiando su clave sustituta a un GUID o algo especial.

3

una forma, envolver esto en una transacción

select id,name into #temp from YourTable 

     truncate table YourTable 

     insert YourTable (name) 
     select name from #temp 
+0

muy bueno! elegante y simple. – uhleeka

+0

pero no arregla su ParentID. – mdma

+4

no había nada sobre parentid en la pregunta cuando lo respondí – SQLMenace

0

aquí cómo puedo restablecer campos de identidad. La versión anterior de CTE (Common Table Expression) es exagerada. Sólo tiene que utilizar el número de fila actual para actualizar la columna de identidad utilizando una instrucción de actualización sencilla con una combinación:

UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable] 
JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber 
    FROM [YourTable]) rn ON rn.ID = [YourTable].ID 

esta declaración puede ser refactorizado a ser aún más simple. Si es así, me gustaría ver la versión más simple.

Espero que esto ayude a alguien.

Cuestiones relacionadas