2012-02-06 22 views
15

Soy estudiante de RDBMS.Agregar columna de clave principal en la tabla SQL

Tengo una pregunta muy básica, por ejemplo, tengo una tabla existente en el servidor SQL. ¿Qué será un script para alterar la tabla?

  • Columna de caída 'RowId', si existe.
  • Drop contraint si existe.
  • Agregue una nueva columna 'RowId' en la tabla.
  • Haga que esta columna sea la clave principal.
  • Autoincrement type int.
+1

Dejar una columna y eliminar una restricción de clave primaria son cosas diferentes. Su primera línea no está clara. ¿Puedes publicar tu intento de esto y explicar dónde estás atascado? – Oded

+0

¿Qué es lo que realmente quieres? –

+0

¿No desea conservar el RowId "viejo" hasta que se complete toda la secuencia? ¿Se espera que este "antiguo" RowId sea IDENTIDAD también? ¿Por qué reemplazar una columna por una del mismo nombre? – gbn

Respuesta

38

En SQL Server 2005 o posterior, puede utilizar este script:

-- drop PK constraint if it exists 
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable') 
    ALTER TABLE dbo.YourTable 
    DROP CONSTRAINT PK_YourTable 
GO 

-- drop column if it already exists 
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable')) 
    ALTER TABLE dbo.YourTable DROP COLUMN RowId 
GO 

-- add new "RowId" column, make it IDENTITY (= auto-incrementing) 
ALTER TABLE dbo.YourTable 
ADD RowId INT IDENTITY(1,1) 
GO 

-- add new primary key constraint on new column 
ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable 
PRIMARY KEY CLUSTERED (RowId) 
GO 

Por supuesto, este script puede todavía fallar, si otras tablas hacen referencia a este dbo.YourTable usando claves foráneas en el pre RowId columna existente ...

actualización: y por supuesto, cualquier uso o dbo.YourTablePK_YourTable, usted tiene que reemplazar aquellos marcador de posición con los nombres de tabla /restricciones reales a partir de su propia base de datos (que no mencionó lo que eran, en su pregunta .....)

+0

la tabla no refrencing en ningún lado pero aún falla ... –

+0

Msg 5074, nivel 16, estado 1, línea 4 El objeto 'PK_tempTable' depende de la columna 'RowId'. –

+0

Bueno, entonces incluya un 'ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_tempTable' - ¿el PK se llama algo más que el nombre de la tabla ??? Si su restricción no se llama 'PK_YourTable', tiene que ** adaptar mi script ** en consecuencia, ¡por supuesto! –

7

Nota: Se añadieron a esta respuesta antes de actualizar las preguntas

  • Añadir nueva columna (nota: sólo se puede tener una columna de identidad por tabla)
  • gota de edad primaria clave
  • Añadir nueva clave primaria
  • gota columna de edad si es necesario

Script de ejemplo:

CREATE TABLE whatever (
    OldPKColumn uniqueidentifier NOT NULL, 
    CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn) 
    ) 

ALTER TABLE whatever 
    ADD RowId int NOT NULL IDENTITY (1,1); 

ALTER TABLE whatever 
    DROP CONSTRAINT PK_whatever; 

ALTER TABLE whatever WITH CHECK 
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId); 

ALTER TABLE whatever 
    DROP COLUMN oldPKcolumn; 

Y un pensamiento al azar ... ¿Estás tratando de restablecer una columna de identidad?
Si es así, a continuación, utilizar DBCC CHECKIDENT

+7

@SOF Usuario: Tengo una mejor idea. Haga una pregunta mejor y no sea grosero. Cambió la pregunta mientras respondía y pedí una aclaración en un comentario. – gbn

1

Sólo un comentario para mejorar estas grandes respuestas (no se puede utilizar comentarios todavía - Soy un punto reputación lejos de ese privilegio) y como referencia en el futuro para mí mismo:

una nueva identidad de la columna (autonumber) puede ser añadido y hecha la clave principal en una sola instrucción, así:

ALTER TABLE ADD Cualquiera que sea ROWID int identidad no NULL cLAVE pRIMARIA;

Prefiero no molestarme con nombres de restricciones cuando no ayuda.

Cuestiones relacionadas