¿Cómo agrego la propiedad de identidad a una columna existente en SQL Server?
-
08-07-2019 - |
Pregunta
En SQL Server (en mi caso, 2005), ¿cómo puedo agregar la propiedad de identidad a una columna de tabla existente usando T-SQL?
Algo así como:
alter table tblFoo
alter column bar identity(1,1)
Solución
No creo que puedas hacer eso. Su mejor opción es crear una nueva columna de identidad y copiar los datos utilizando un comando de inserción de identidad (si realmente desea mantener los valores anteriores).
Aquí hay un artículo decente que describe el proceso en detalle: http://www.mssqltips.com/tip.asp?tip=1397
Otros consejos
La solución publicada por Vikash no funciona; produce una " Sintaxis incorrecta " error en SQL Management Studio (2005, como se especifica el OP). El hecho de que la "Edición compacta" de SQL Server admite este tipo de operación es solo un acceso directo, porque el proceso real es más parecido a lo que Robert & amp; JohnFX dijo: crear una tabla duplicada, completar los datos, renombrar el & amp; nuevas tablas adecuadamente.
Si desea mantener los valores que ya existen en el campo que debe ser una identidad, puede hacer algo como esto:
CREATE TABLE tname2 (etc.)
INSERT INTO tname2 FROM tname1
DROP TABLE tname1
CREATE TABLE tname1 (with IDENTITY specified)
SET IDENTITY_INSERT tname1 ON
INSERT INTO tname1 FROM tname2
SET IDENTITY_INSERT tname1 OFF
DROP tname2
¡Por supuesto, no se recomienda soltar y volver a crear una tabla (tname1) que se usa con código en vivo ! :)
¿Está poblada la tabla? Si no, suelte y vuelva a crear la tabla.
Si se llena, ¿qué valores ya existen en la columna? Si son valores que no desea conservar.
Cree una nueva tabla como lo desee, cargue los registros de su tabla anterior en su nuevo talbe y deje que la base de datos llene la columna de identidad como de costumbre. Cambie el nombre de su tabla original y cambie el nombre de la nueva al nombre correcto :).
Finalmente, si la columna en la que desea crear una identidad actualmente contiene valores de clave primaria y ya está siendo referenciada por otras tablas, tendrá que volver a pensar totalmente si está seguro de que esto es lo que quiere hacer :)
No hay una forma directa de hacerlo, excepto:
A) a través de SQL es decir:
-- make sure you have the correct CREATE TABLE script ready with IDENTITY
SELECT * INTO abcTable_copy FROM abcTable
DROP TABLE abcTable
CREATE TABLE abcTable -- this time with the IDENTITY column
SET IDENTITY_INSERT abcTable ON
INSERT INTO abcTable (..specify all columns!) FROM (..specify all columns!) abcTable_copy
SET INDENTITY_INSERT abcTable OFF
DROP TABLE abcTable_copy
-- I would suggest to verify the contents of both tables
-- before dropping the copy table
B) A través de MSSMS que hará exactamente lo mismo en el fondo pero reducirá la cantidad de dedos gordos.
- En el Explorador de objetos MSSMS, haga clic derecho en la tabla que necesita modificar
- Seleccione " diseño " Seleccione la columna a la que desea agregar IDENTIDAD
- Cambie la configuración de identidad de NO - > SÍ (posiblemente semilla)
- Ctr + S la tabla
Esto soltará y volverá a crear la tabla con todos los datos originales. Si recibe una advertencia:
Vaya a MSSMS Herramientas - > Opciones - > Diseñadores - > Diseñadores de tablas y bases de datos y desmarque la opción " Evitar guardar cambios que requieren la recreación de la tabla "
Cosas a tener en cuenta:
- su DB tiene suficiente espacio en disco antes de hacer esto
- la base de datos no está en uso (especialmente la tabla que está cambiando)
- asegúrese de hacer una copia de seguridad de su base de datos antes de hacerlo
- si la tabla tiene muchos datos (más de 1G) pruébelo primero en otro lugar antes de usar en DB real
-
Crear una nueva tabla
SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
-
Eliminar columna de una tabla nueva
Alter table Table_New drop column id;
-
Agregar columna con identidad
Alter table Table_New add id int primary key identity;
-
Obtener todos los datos en una nueva tabla
SET IDENTITY_INSERT Table_New ON; INSERT INTO Table_New (id, Name,CreatedDate,Modified) SELECT id, Name,CreatedDate,Modified FROM Table_Current; SET IDENTITY_INSERT Table_New OFF;
-
Descartar tabla antigua
drop table Table_Current;
-
Renombrar nueva tabla como antigua
EXEC sp_rename 'Table_New', 'Table_Current';
alter table tablename
alter column columnname
add Identity(100,1)