2011-02-01 17 views
182

Como título, tengo una tabla existente que ya está llena con 150000 registros. He agregado una columna Id (que actualmente es nula).SQL Server agregar la clave primaria de incremento automático a la tabla existente

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

Respuesta

310

No - usted tiene que hacerlo al revés: añadir cosas bien desde el principio como INT IDENTITY - que estará lleno de valores de identidad al hacer esto:

ALTER TABLE dbo.YourTable 
    ADD ID INT IDENTITY 

y entonces usted puede hacer que la clave principal:

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

o si usted prefiere hacerlo todo en un solo paso:

ALTER TABLE dbo.YourTable 
    ADD ID INT IDENTITY 
     CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED 
+0

estoy usando la interfaz de phpMyAdmin. Obtuve errores de SQL al intentar utilizar la palabra clave 'IDENTIDAD', que tampoco estaba disponible en la GUI. Funcionó cuando agregué una nueva fila con AUTO_INCREMENT seleccionado y su tipo como INT PRIMARY. – daveagp

+0

La palabra clave Identity es específica de SQL Server. Auto_Increment es la versión de MySQL que encontraste. http://stackoverflow.com/questions/10283780/equivalent-of-mssql-identity-column-in-mysql – AndyMcKenna

+2

Esta es una muy buena respuesta, pero ¿cómo puedo cambiar el número entero inicial de 1 a 1000? Me gustaría empezar a contar en 1000. Sospecho que puedo usar 'ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1' pero no quise probarlo sin consultar con un experto :) Ref. http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm – user1477388

18

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

Si no le importa el orden de los números, debe agregar la columna, NO NULO, con IDENTIDAD de una sola vez. 150k filas no es mucho.

Si necesita conservar algún orden numérico, añada los números correspondientes. Luego use el diseñador de tablas SSMS para establecer la propiedad IDENTITY. Esto le permite generar una secuencia de comandos que hará la columna soltar/agregar/mantener números/resiembra por usted.

+4

El OP está en SQL Server 2008 [hay una forma] (http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any- data-loss/6086661 # 6086661) –

+1

@Martin: interesante que podemos perder el tiempo con las tablas del sistema ... – gbn

+0

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 la 'ALTER TABLE .. . SWITCH' puede hacerlo sin eso. –

-3

intentar algo como esto (en una tabla de prueba en primer lugar):

 
USE your_database_name 
GO 
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0 
BEGIN 
    SET ROWCOUNT 1 
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1 
END 
PRINT 'ALL DONE' 

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

+1

-1 No responde la pregunta (que se trata de agregar columnas 'IDENTIDAD') y no funcionaría de todos modos. 'ACTUALIZA your_table SET your_id_field = MAX (your_id_field) + 1' no puedes simplemente tirar en 'MAX' allí. ¿Dónde está una cláusula 'WHERE' para evitar simplemente actualizar repetidamente la misma fila? –

8

Tuve este problema, pero no pude usar una columna de identidad (por varias razones). que se establecieron en esto:

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

tomado de here.

2

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

2

Si la columna ya existe en su mesa y es nula, puede actualizar la columna con este comando (reemplace identificación, nombre de tabla, y tablekey):

UPDATE x 
SET x.<Id> = x.New_Id 
FROM (
    SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id 
    FROM <tablename> 
) x 
+0

¡Me ahorraste tiempo con este! Buen apéndice a la respuesta de @ gbn. –

0

Aquí es una idea que puede probar. Tabla original: sin columna de identidad table1 cree una tabla nueva: llame a table2 junto con la columna de identidad. copie los datos de la tabla 1 a la tabla 2: la columna de identidad se rellena automáticamente con números automáticos incrementados.

cambiar el nombre de la tabla original - tabla1 a cuadro3 cambiar el nombre de la nueva tabla - tabla2 a tabla1 (tabla original) Ahora usted tiene la tabla1 con columna de identidad incluido y poblada de los datos existentes. después de asegurarse de que no haya problemas y de que funcione correctamente, suelte la tabla3 cuando ya no la necesite.

0

Cree una tabla nueva con nombre diferente y las mismas columnas, clave principal y asociación de clave externa y vincule esto en su instrucción de código Insertar. Para E.g: 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 EMPLOYEE existente o realizar algún ajuste de acuerdo con sus necesidades.

-3

Esto funciona en MariaDB, por lo que sólo puede esperar que lo hace en SQL Server: Gota de la columna ID que acaba de insertar, a continuación, utilizar la siguiente sintaxis: -

ALTER TABLE nombre_tabla ADD Identificación del INT CLAVE PRIMARIA AUTO_INCREMENT ;

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

1

por el diseñador podría establecer la identidad (1,1) haga clic derecho sobre TBL => el desing => en la parte izquierda (clic derecho) => propiedades => en las columnas de identidad seleccione #column

Properties

idendtity column

+0

¿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 los pros/contras del enfoque. – jinglesthula

+0

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 Tienda o desencadenar. –

0

Si la tabla tiene relación con otras tablas utilizando su clave primaria o foriegen, puede ser que es imposible alterar su mesa. por lo que debe soltar y crear la tabla nuevamente.
Para resolver estos problemas, debe Generar guiones haciendo clic con el botón derecho en la base de datos y en la opción avanzada establecer el tipo de datos para guiar al esquema y a los datos. después de eso, usando esta secuencia de comandos con el cambio de su columna para identificar y regenerar la tabla usando ejecutar su consulta.
la 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 
Cuestiones relacionadas