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

253

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

Supongo que puedo ejecutar una consulta para llenar 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 lleno los números iniciales?

Miedo de planetas
fuente

Respuestas:

429

No, debe hacerlo al revés: agréguelo desde el principio, ya INT IDENTITYque se llenará de valores de identidad cuando haga 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 hacer todo en un solo paso:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
marc_s
fuente
2
Esta es una muy buena respuesta, pero ¿cómo puedo cambiar el número entero inicial de 1 a 1000? Me gustaría comenzar a contar a 1000. Sospecho que puedo usarlo, ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1pero no quería probarlo sin consultar con un experto :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388
3
Acabo de usar esto y parece haber funcionadoalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388
1
@stom: si no especifica nada, se utilizará seed = 1 e increment = 1, que es la configuración más utilizada de todos modos. Si creó una tabla como esta, funcionará bien. Pero recomendaría especificar siempre explícitamente la semilla y el incremento en sus scripts SQL, especialmente para un sitio más grande. Es solo una buena práctica.
marc_s
1
@stom: bueno, PRIMARY KEYeso implica que NOT NULLestá en su lugar, así que de nuevo, no es absolutamente necesario. Pero prefiero ser explícita y así siempre tengo la NOT NULLhay, sólo para estar absolutamente claro
marc_s
3
@ turbo88: cuando define su PRIMARY KEY, el índice agrupado se crea automáticamente para usted (a menos que especifique explícitamente NONCLUSTERED)
marc_s
19

No 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, NO NULL, con IDENTIDAD de una vez. 150k filas no es mucho.

Si necesita conservar algún orden numérico, agregue los números en consecuencia. Luego, use el diseñador de tablas SSMS para establecer la propiedad IDENTITY. Esto le permite generar una secuencia de comandos que hará que la columna se suelte / agregue / guarde números / vuelva a cargar por usted.

gbn
fuente
55
El OP está en SQL Server 2008, así que hay una manera
Martin Smith
Toda la instancia debe iniciarse en modo de usuario único, por lo que probablemente no sea viable para la mayoría de las circunstancias, pero ALTER TABLE ... SWITCHpuede hacerlo sin eso.
Martin Smith
11

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 

Prestado de aquí .

Kevin
fuente
4

Si la columna ya existe en su tabla y es nula, puede actualizar la columna con este comando (reemplazar 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
fuente
¡Me ahorraste tiempo con este! Buena adición a la respuesta de @ gbn.
Kristen Waite
2

Cuando agregamos una columna de identidad en una tabla existente, se rellenará automáticamente sin necesidad de rellenarla manualmente.

usuario3279092
fuente
2

por el diseñador puede establecer identidad (1,1) haga clic derecho en tbl => diseño => en parte izquierda (clic derecho) => propiedades => en columnas de identidad seleccione #columna

Propiedades

columna de identidad

gustavo herrera
fuente
1
¿Tiene información sobre si este es un buen enfoque? El OP pregunta si es la "forma correcta de proceder". Una respuesta más completa podría ayudarlos a conocer las ventajas y desventajas del enfoque.
jinglesthula
Realmente estoy usando esta opción en el entorno de desarrollo, si desea pasar este cambio a producción, debe verificar con VER DEPENDENCIA si el campo de identidad está siendo utilizado por algún procedimiento de Almacén o disparador.
gustavo herrera
2

Si su tabla tiene relación con otras tablas que usan su clave primaria o foriegen, es posible que sea imposible alterar su tabla. por lo que debe soltar y crear la tabla nuevamente.
Para resolver estos problemas, debe generar scripts haciendo clic con el botón derecho en la base de datos y, en la opción avanzada, configure el tipo de datos en script para esquema y datos. después de eso, usando este script con el cambio de su columna para identificar y regenerar la tabla usando ejecutar su consulta.
su consulta será como aquí:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
Hamid
fuente
0

Aquí hay una idea que puedes probar. Tabla original: sin columna de identidad tabla1 cree una nueva tabla: llame a tabla2 junto con la columna de identidad. copie los datos de la tabla1 a la tabla2: la columna de identidad se rellena automáticamente con números con incremento automático.

cambie el nombre de la tabla original - tabla1 a tabla3 cambie el nombre de la nueva tabla - tabla2 a tabla1 (tabla original) Ahora tiene la tabla1 con la columna de identidad incluida y rellenada para los datos existentes. después de asegurarse de que no haya ningún problema y de que funcione correctamente, suelte la tabla3 cuando ya no sea necesario.

JH326
fuente
0

Cree una nueva tabla con nombre diferente y las mismas columnas, clave principal y asociación de clave externa y vincule esto en su declaración de código Insert. Por ejemplo: para EMPLEADO, reemplace con EMPLEADOS.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

Sin embargo, debe eliminar la tabla de EMPLEADOS existente o hacer algún ajuste de acuerdo con sus requisitos.

kumarP
fuente
0

Esta respuesta es una pequeña adición a la respuesta más votada y funciona para SQL Server. La pregunta solicitó una clave primaria de incremento automático, la respuesta actual agrega la clave primaria, pero no está marcada como incremento automático. El siguiente script verifica las columnas, la existencia y lo agrega con el indicador de autoincremento habilitado.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
John K.
fuente
0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 
Sandesh Jain
fuente
55
¿Puedes explicarlo?
Muhammad Dyas Yaskur
1
Si bien este código puede resolver el problema del OP, es mejor incluir una explicación sobre cómo su código resuelve el problema del OP. De esta forma, los futuros visitantes pueden aprender de su publicación y aplicarla a su propio código. SO no es un servicio de codificación, sino un recurso para el conocimiento. Además, es más probable que se voten las respuestas completas de alta calidad. Estas características, junto con el requisito de que todas las publicaciones sean independientes, son algunos de los puntos fuertes de SO como plataforma, que lo diferencia de los foros. Puede editar para agregar información adicional y / o para complementar sus explicaciones con la documentación de origen.
ysf
-1

alter table / ** pega el nombre del tabal ** / add id int IDENTITY (1,1)

eliminar de / ** pegar el nombre del tabal ** / where id in

(

seleccione a.id FROM / ** pegue el nombre del tabal / como una IZQUIERDA EXTERIOR IZQUIERDA (SELECCIONE MIN (id) como id FROM / pegue el nombre del tabal / GROUP BY / pegue las columnas c1, c2 .... ** /

) as t1 
ON a.id = t1.id

DONDE t1.id ES NULO

)

alter table / ** pega el nombre del tabal ** / DROP COLUMN id

Mohamed Sakilani
fuente
¿Cuál es tu pregunta? Cómo preguntar
Ann Kilzer
1
Edite su respuesta, utilizando Markdown para formatear correctamente su ejemplo de código.
Bill Keller
-3

Pruebe algo como esto (primero en una tabla de prueba):

USE your_database_name
VAMOS
MIENTRAS (SELECCIONE EL CONTEO (*) DESDE your_table WHERE your_id_field IS NULL)> 0
EMPEZAR
    SET ROWCOUNT 1
    ACTUALIZAR your_table SET your_id_field = MAX (your_id_field) +1
FINAL
IMPRIMIR TODO HECHO

No he probado esto en absoluto, ¡así que ten cuidado!

PacDemon
fuente
1
-1 No responde la pregunta (que trata sobre agregar IDENTITYcolumnas) y no funcionaría de todos modos. UPDATE your_table SET your_id_field = MAX(your_id_field)+1no puedes simplemente arrojarte MAXallí. ¿Dónde hay una WHEREcláusula para evitar simplemente actualizar repetidamente la misma fila?
Martin Smith
-3

Esto funciona en MariaDB, así que solo espero que lo haga en SQL Server: suelte la columna de ID que acaba de insertar, luego use la siguiente sintaxis: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

No hay necesidad de otra mesa. Esto simplemente inserta una columna de identificación, la convierte en el índice primario y la rellena con valores secuenciales. Si SQL Server no hace esto, mis disculpas por perder su tiempo.

Guerrero del camino
fuente
-3

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT; Esto podría ser útil.

Asesino
fuente