SQL Server agrega clave primaria de incremento automático a la tabla existente

Resuelto fearofawhackplanet asked hace 13 años • 16 respuestas

Como título, tengo una tabla existente que ya está llena con 150000 registros. Agregué una columna de identificación (que actualmente es nula).

Supongo que puedo ejecutar una consulta para completar esta columna con números incrementales y luego establecerla como clave principal y activar el incremento automático. ¿Es esta la forma correcta de proceder? Y si es así ¿cómo completo los números iniciales?

fearofawhackplanet avatar Feb 01 '11 19:02 fearofawhackplanet
Aceptado

No, tienes que hacerlo al revés: agrégalo desde el principio INT IDENTITY, ya que se llenará con valores de identidad cuando hagas esto:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

y luego puedes convertirla en la clave principal:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

o si prefieres hacerlo todo en un solo paso:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
marc_s avatar Feb 01 '2011 12:02 marc_s

No se puede "activar" la IDENTIDAD: es una reconstrucción de la tabla.

Si no le importa el orden de los números, agregaría la columna NOT NULL con IDENTITY de una sola vez. 150.000 filas no es mucho.

Si necesita conservar algún orden numérico, sume los números en consecuencia. Luego use el diseñador de tablas SSMS para establecer la propiedad IDENTIDAD. Esto le permite generar un script que eliminará/agregará/mantendrá números/resembrará la columna por usted.

gbn avatar Feb 01 '2011 12:02 gbn

Tuve este problema, pero no pude usar una columna de identidad (por varias razones). Me decidí por esto:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Tomado prestado de aquí .

Kevin avatar Sep 20 '2012 17:09 Kevin

Si la columna ya existe en su tabla y es nula, puede actualizar la columna con este comando (reemplace id, nombre de tabla y clave de tabla):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
Renzo Ciot avatar Jul 14 '2014 14:07 Renzo Ciot