Cómo agrego la propiedad identity a una columna existente en SQL Server


En SQL Server (en mi caso, 2005) ¿cómo puedo agregar la propiedad identity a una columna de tabla existente usando T-SQL?

Algo como:

alter table tblFoo 
    alter column bar identity(1,1)
Author: marc_s, 2008-11-13

5 answers

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 antiguos).

Aquí hay un artículo decente que describe el proceso en detalle: http://www.mssqltips.com/tip.asp?tip=1397

 30
Author: JohnFx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 20:59:46

La solución publicada por Vikash no funciona; produce un error de "sintaxis incorrecta" en SQL Management Studio (2005, como el OP especificado). El hecho de que la" Edición Compacta " de SQL Server soporte este tipo de operación es solo un atajo, porque el proceso real se parece más a lo que Robert & JohnFX dijo: crear una tabla duplicada, rellenar los datos, cambiar el nombre de las tablas originales y nuevas apropiadamente.

Si desea mantener los valores que ya existen en el campo que necesita para ser una identidad, podrías 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 dejar caer y volver a crear una tabla (nombre1) que es utilizada por live code! :)

 12
Author: NateJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-26 21:14:21

¿Está rellenada la tabla? Si no caer y volver a crear la tabla.

Si se rellena, ¿qué valores ya existen en la columna? Si son valores que no quieres mantener.

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 de forma normal. Cambie el nombre de la tabla original y cambie el nombre de la nueva al nombre correcto:).

Finalmente si la columna que desea hacer identidad actualmente contiene valores de clave primaria y ya está siendo referenciado por otras tablas que tendrá que re pensar totalmente si estás seguro de que esto es lo que quieres hacer:)

 2
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-14 12:08:36

No hay forma directa de hacer esto 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 hará menos fat-digitación.

  • En el Explorador de objetos MSSMS, haga clic con el botón 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 - > YES (posiblemente seed)
  • Ctr + S el tabla

introduzca la descripción de la imagen aquí

Esto caerá y recreará la tabla con todos los datos originales en ella. Si recibe una advertencia:

introduzca la descripción de la imagen aquí

Vaya a MSSMS Herramientas - > Opciones -> Diseñadores - > Diseñadores de tablas y bases de datos y desmarca la opción "Evite guardar los cambios que requieren la recreación de la tabla"

Cosas a tener en cuenta:

  1. su base de datos tiene suficiente espacio en disco antes que usted esto
  2. la base de datos no está en uso (especialmente la tabla que está cambiando)
  3. asegúrese de hacer una copia de seguridad de su base de datos antes de hacerlo
  4. si la tabla tiene muchos datos (más de 1G) pruébelo en otro lugar primero antes de usar en DB real
 0
Author: Milan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-25 19:50:45
alter table tablename 
alter column columnname 
add Identity(100,1)
 -5
Author: a_m0d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-14 19:51:16