No puede alterar las columnas existentes para la identidad.
Tienes 2 opciones,
Cree una nueva tabla con identidad y descarte la tabla existente
Cree una nueva columna con identidad y suelte la columna existente
Enfoque 1. ( Nueva tabla ) Aquí puede conservar los valores de datos existentes en la columna de identidad recién creada.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Enfoque 2 ( Nueva columna ) No puede retener los valores de datos existentes en la columna de identidad recién creada. La columna de identidad contendrá la secuencia de números.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Consulte la siguiente publicación del foro de Microsoft SQL Server para obtener más detalles:
Cómo alterar la columna a identidad (1,1)
IDENTITY(1, 1)
parte con la columna de la clave primariaEn SQL 2005 y versiones posteriores, hay un truco para resolver este problema sin cambiar las páginas de datos de la tabla. Esto es importante para tablas grandes donde tocar cada página de datos puede llevar minutos u horas. El truco también funciona incluso si la columna de identidad es una clave principal, es parte de un índice agrupado o no agrupado, u otras trampas que pueden disparar la solución más simple de "agregar / eliminar / renombrar columna".
Aquí está el truco: puede usar la instrucción ALTER TABLE ... SWITCH de SQL Server para cambiar el esquema de una tabla sin cambiar los datos, lo que significa que puede reemplazar una tabla con una IDENTIDAD con un esquema de tabla idéntico, pero sin una columna IDENTIDAD. El mismo truco funciona para agregar IDENTIDAD a una columna existente.
Normalmente, ALTER TABLE ... SWITCH se usa para reemplazar eficientemente una partición completa en una tabla particionada con una nueva partición vacía. Pero también se puede usar en tablas no particionadas.
He usado este truco para convertir, en menos de 5 segundos, una columna de una tabla de 2.500 millones de filas de IDENTIDAD a no IDENTIDAD (para ejecutar una consulta de varias horas cuyo plan de consulta funcionó mejor para no IDENTIDAD columnas), y luego restableció la configuración IDENTIDAD, nuevamente en menos de 5 segundos.
Aquí hay una muestra de código de cómo funciona.
Obviamente, esto es más complicado que las soluciones en otras respuestas, pero si su tabla es grande, puede ser un verdadero salvavidas. Hay algunas advertencias:
Hay un buen artículo en TechNet que detalla los requisitos anteriores.
ACTUALIZACIÓN: Eric Wu hizo un comentario a continuación que agrega información importante sobre esta solución. Copiéndola aquí para asegurarse de que reciba más atención:
Si la tabla se está extendiendo activamente con nuevas filas (lo que significa que no tiene mucho tiempo de inactividad entre agregar IDENTIDAD y agregar nuevas filas, en lugar de
DBCC CHECKIDENT
que desee establecer manualmente el valor de origen de identidad en el nuevo esquema de tabla para más grande que la ID existente más grande en la tabla, por ejemplo,IDENTITY (2435457, 1)
es posible que pueda incluir tanto elALTER TABLE...SWITCH
y elDBCC CHECKIDENT
en una transacción (o no, no lo he probado), pero parece que establecer el valor inicial manualmente será más fácil y seguro.Obviamente, si no se agregan nuevas filas a la tabla (o solo se agregan ocasionalmente, como un proceso diario de ETL), esta condición de carrera no sucederá, por lo que
DBCC CHECKIDENT
está bien.fuente
DBCC CHECKIDENT('<newTableName>')
inmediatamente después de cambiar. Consulte msdn.microsoft.com/en-us/library/ms176057.aspx para obtener más información.No puede modificar una columna para que sea una columna IDENTIDAD. Lo que tendrá que hacer es crear una nueva columna que se define como una IDENTIDAD desde el principio, luego suelte la columna anterior y cambie el nombre de la nueva por el nombre anterior.
Bagazo
fuente
Aquí se describe una solución interesante: SERVIDOR SQL - Agregar o quitar propiedad de identidad en la columna
En resumen, edite manualmente su tabla en SQL Manager, cambie la identidad, NO GUARDE los cambios, solo muestre el script que se creará para los cambios, cópielo y úselo más tarde.
Es un gran ahorro de tiempo, ya que (el script) contiene todas las claves externas, índices, etc. relacionados con la tabla que cambia. Escribiendo esto manualmente ... Dios no lo quiera.
fuente
Considere usar SECUENCIA en lugar de IDENTIDAD .
En el servidor sql 2014 (no sé sobre versiones anteriores) puede hacer esto simplemente, usando la secuencia.
Desde aquí: secuencia como valor predeterminado para una columna
fuente
Explicación simple
Cambie el nombre de la columna existente usando sp_RENAME
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Ejemplo para cambiar el nombre:
La columna existente UserID se renombra como OldUserID
Luego agregue una nueva columna usando la consulta alter para establecer como clave principal y valor de identidad
Ejemplo para establecer clave primaria
El nuevo nombre de columna creado es UserID
luego suelte la columna renombrada
Ejemplo para soltar columna renombrada
Ahora hemos agregado una clave primaria y una identidad a la columna existente en la tabla.
fuente
Soy un desarrollador de Java que pasó a formar parte de un equipo sin un DBA y en el que, como desarrollador, no puedo obtener los derechos de DBA. Se me asignó la tarea de mover un esquema completo entre dos bases de datos, por lo que sin tener un DBA, tuve que hacerlo y hacerlo ejecutando scripts, no pudiendo usar la GUI en SQL Server 2008 porque no tenía privilegios de administrador.
Sin embargo, todo se movió sin problemas al ejecutar un procedimiento almacenado en el nuevo esquema.table, descubrí que perdí el campo de identidad en una tabla. Verifiqué dos veces el script que creó la tabla y estaba allí, sin embargo, SQL Server no lo obtuvo cuando ejecuté el script. Un DBA me dijo después que había visto este mismo problema antes.
En cualquier caso, para SQL Server 2008, estos son los pasos que tomé para resolver esto y funcionaron, así que estoy publicando esto aquí con la esperanza de que sea de ayuda para alguien. Esto es lo que hice, ya que tenía dependencias de FK en otra tabla que lo hizo más difícil:
Utilicé esta consulta para verificar que faltaba la identidad y para ver las dependencias en la tabla.
1.) Encuentra estadísticas en una tabla:
2.) Cree una tabla nueva idéntica y duplicada, excepto que agregue un campo de identidad en el campo PK donde había estado antes.
3.) Desactiva la identidad para mover datos.
4.) Transfiera los datos.
5.) Verifique que los datos estén allí.
6.) Vuelva a habilitar la identidad.
7.) Este es el mejor script que encontré para obtener todas las relaciones FK para verificar a qué tabla (s) hace referencia la tabla original como dependencias y encontré muchas, ¡así que es un guardián!
8.) Asegúrese de tener todos los scripts PK y FK para todas las tablas involucradas, antes del siguiente paso.
9.) Puede hacer clic con el botón derecho en cada tecla y escribir esto usando SQL Server 2008
10.) Descarte los FK de las tablas de dependencias utilizando esta sintaxis:
11.) Suelta la tabla original:
13.) Estos próximos pasos se basan en los scripts que creó en SQL Server 2008 en el paso 9.
--Agregue el PK a la nueva tabla.
--Agregue el FK a la nueva tabla.
--Agregue los FK de vuelta a la tabla de dependencias.
14.) Verifique que todo sea correcto y completo. Usé la GUI para mirar las tablas.
15.) Cambie el nombre de la nueva tabla al nombre de las tablas originales.
¡Finalmente, todo funcionó!
fuente
no puede hacerlo así, necesita agregar otra columna, soltar la columna original y cambiar el nombre de la nueva columna o crear una nueva tabla, copiar los datos y soltar la tabla anterior y luego renombrar la nueva tabla a la anterior mesa
si usa SSMS y establece la propiedad de identidad en ON en el diseñador, esto es lo que SQL Server hace detrás de escena. Entonces, si tiene una tabla llamada [usuario], esto es lo que sucede si crea ID de usuario e identidad
Habiendo dicho eso, hay una manera de hackear la tabla del sistema para lograrlo estableciendo el valor bit a bit, pero eso no es compatible y no lo haría
fuente
Como entendí en casos normales, estamos creando una tabla con la clave primaria que tiene la propiedad de identidad.
Por lo tanto, cambiar el nombre o eliminar una columna asociada con la restricción de la clave primaria no será posible porque las reglas de restricción están validando la estructura de la columna.
Para lograr esto, tenemos que procesar algunos pasos de la siguiente manera:
Supongamos que TableName = 'Employee' y ColumnName = 'EmployeeId'
1. Agregue una nueva columna 'EmployeeId_new' en la tabla 'Employee'
ALTER TABLE Employee ADD EmployeeId_new INT IDENTITY ( 1,1)
Ahora elimine la columna 'EmployeeId' de la tabla 'Employee'.
ALTER TABLE Employee DROP COLUMN EmployeeId
Esto arrojará un error debido a que las reglas de restricción de clave primaria son aplicables y validan la estructura de la columna.
* ### ' Mensaje 5074, Nivel 16, Estado 1, Línea 1 El objeto [PK_dbo.Employee] depende de colmn [EmployeeId].' ###
Por lo tanto, primero debemos eliminar la restricción de la clave principal de la tabla 'Empleado' y luego podemos eliminar la columna
ALTER TABLE. Restricción DROP del empleado [PK_dbo.Employee]
Ahora podemos eliminar la columna 'EmployeeId' de la tabla 'Employee' como lo hizo en el paso anterior donde obtuvimos el error
ALTER TABLE Employee DROP COLUMN EmployeeId
Ahora se elimina la columna 'EmployeeId' de la tabla, así que cambiaremos el nombre de la nueva columna recién agregada 'EmployeeId_new' con 'EmployeeId'
sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'
Para reorganizar la tabla en la misma forma en que estaba, tenemos que agregar la restricción de clave primaria para la columna 'EmployeeId'.
ALTER TABLE Empleado agregar restricción [PK_dbo.Employee] clave primaria (EmployeeId)
8. Ahora la tabla 'Empleado' con 'Id. De empleado' se modifica para las reglas de identidad junto con la restricción de clave principal existente
fuente
Por diseño, no hay una manera simple de activar o desactivar la función de identidad para una columna existente. La única forma limpia de hacerlo es crear una nueva columna y convertirla en una columna de identidad o crear una nueva tabla y migrar sus datos.
Si utilizamos SQL Server Management Studio para eliminar el valor de identidad en la columna "id", se crea una nueva tabla temporal, los datos se mueven a la tabla temporal, la tabla anterior se descarta y la nueva tabla se renombra.
Use Management Studio para realizar el cambio y luego haga clic derecho en el diseñador y seleccione "Generar secuencia de comandos de cambio".
Verá que esto es lo que el servidor SQL está haciendo en segundo plano.
fuente
No hay uno, lamentablemente; la propiedad IDENTITY pertenece a la tabla en lugar de a la columna.
La forma más fácil es hacerlo en la GUI, pero si esto no es una opción, puede recorrer el camino de copiar los datos, soltar la columna, volver a agregarlos con identidad y volver a colocar los datos.
Vea aquí para una cuenta de golpe por golpe.
fuente
Haga clic derecho en el nombre de la tabla en el Explorador de objetos. Obtendrás algunas opciones. Haga clic en 'Diseño'. Se abrirá una nueva pestaña para esta tabla. Puede agregar la restricción de identidad aquí en 'Propiedades de columna'.
fuente
Para modificar las propiedades de identidad de una columna:
Eso es todo, y funcionó para mí.
fuente
Si estás usando Visual Studio 2017+
Esto lo hará todo por ti.
fuente
Si el póster original realmente deseaba establecer una columna existente para ser una
PRIMARY KEY
para la tabla y realmente no necesitaba que la columna fuera unaIDENTITY
columna (dos cosas diferentes), esto se puede hacer a través de t-SQL con:Tenga en cuenta el paréntesis alrededor del nombre de la columna después de la
PRIMARY KEY
opción.Aunque esta publicación es antigua y estoy asumiendo la necesidad de los solicitantes, sentí que esta información adicional podría ser útil para los usuarios que se encuentran con este hilo, ya que creo que la conversación podría llevar a creer que una columna existente no se puede configurar como clave principal sin agregarla primero como una nueva columna, lo que sería incorrecto.
fuente
Según mi condición actual, sigo este enfoque. Quiero dar identidad a una tabla primaria después de que los datos se inserten a través del script.
Como quiero agregar identidad, siempre comienza del 1 al final del recuento de registros que quiero.
Esto creará la misma columna de clave primaria con identidad
Usé estos enlaces: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Agregar clave principal a la tabla existente
fuente
No creo que pueda alterar una columna existente para que sea una columna de identidad usando tsql. Sin embargo, puede hacerlo a través de la vista de diseño de Enterprise Manager.
Alternativamente, podría crear una nueva fila como la columna de identidad, soltar la columna anterior y luego renombrar su nueva columna.
fuente
Básicamente hay cuatro pasos lógicos.
Crear una nueva columna de identidad. Active Insertar identidad para esta nueva columna.
Inserte los datos de la columna de origen (la columna que desea convertir a Identidad) en esta nueva columna.
Desactive Insertar identidad para la nueva columna.
Suelte su columna fuente y cambie el nombre de la nueva columna al nombre de la columna fuente.
Puede haber algunas complejidades más como trabajar en varios servidores, etc.
Consulte el siguiente artículo para conocer los pasos (uso de ssms y T-sql). Estos pasos están destinados a principiantes con menos control sobre T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
fuente
genera un script para todas las tablas con clave primaria = bigint que no tienen un conjunto de identidad; esto devolverá una lista de scripts generados con cada tabla;
fuente