Tengo una base de datos MS SQL 2005 con una tabla Test
con columna ID
. ID
es una columna de identidad
Tengo filas en esta tabla y todas ellas tienen su correspondiente valor de incremento automático de ID.
Ahora me gustaría cambiar cada ID en esta tabla así:
ID = ID + 1
Pero cuando hago esto me sale un error:
No se puede actualizar la columna de identidad 'ID'.
He intentado esto:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Pero esto no resuelve el problema.
Necesito tener una identidad establecida en esta columna, pero también necesito cambiar los valores de vez en cuando. Entonces mi pregunta es cómo lograr esta tarea.
sql-server
sql-server-2005
tsql
identity
sql-server-2005-express
Tomasz Smykowski
fuente
fuente
#temp
tabla que abandonas es otro paso que no has contado aquí.IDENTITY
Los valores de columna son inmutables.Sin embargo, es posible cambiar los metadatos de la tabla para eliminar la
IDENTITY
propiedad, realizar la actualización y luego volver a cambiar.Asumiendo la siguiente estructura
Entonces puedes hacer
En SQL Server 2012 es posible tener una columna de incremento automático que también puede actualizarse más directamente con
SEQUENCES
fuente
A través de la interfaz de usuario en el administrador de SQL Server 2005, cambie la columna, elimine la propiedad del número automático (identidad) de la columna (seleccione la tabla haciendo clic derecho sobre ella y elija "Diseño").
Luego ejecute su consulta:
Luego vaya y agregue la propiedad de autonumeración nuevamente a la columna.
fuente
Id
valores de identidad automática desactivados en 1.En primer lugar, la configuración de IDENTITY_INSERT activada o desactivada para ese asunto no funcionará para lo que necesita (se utiliza para insertar nuevos valores, como tapar huecos).
Hacer la operación a través de la GUI solo crea una tabla temporal, copia todos los datos en una nueva tabla sin un campo de identidad y cambia el nombre de la tabla.
fuente
Esto se puede hacer usando una tabla temporal.
La idea
Consultas SQL
Digamos que su
test
tabla tiene dos columnas adicionales (column2
ycolumn3
) y que hay 2 mesas que tienen las claves externas que hacen referencia atest
los llamadosforeign_table1
yforeign_table2
(debido a problemas de la vida real nunca son simples).Eso es.
fuente
DBCC CHECKIDENT ('databasename.dbo.orders', RESEED, 999) puede cambiar cualquier número de columna de identidad con este comando, y también puede iniciar ese número de campo desde cada número que desee. Por ejemplo, en mi comando, pido comenzar desde 1000 (999 + 1) esperan que sea suficiente ... buena suerte
fuente
Si la columna no es un PK, siempre puede crear una NUEVA columna en la tabla con los números incrementados, descartar el original y luego modificar el nuevo para que sea el antiguo.
curiosidad por saber por qué podría necesitar hacer esto ... la mayoría de las veces que he tenido que trabajar con columnas de Identidad fue rellenar números y acabé usando DBCC CHECKIDENT (nombre de tabla, RESEED, newnextnumber)
¡buena suerte!
fuente
La modificación de la identidad puede fallar dependiendo de una serie de factores, principalmente en torno a los objetos / relaciones vinculados a la columna de identificación. Parece que el diseño de db es un problema aquí, ya que los ID rara vez deberían cambiar (estoy seguro de que tiene sus razones y está cambiando los cambios). Si realmente necesita cambiar las identificaciones de vez en cuando, le sugiero que cree una nueva columna de identificación ficticia que no sea la clave principal / número automático que puede administrar usted mismo y generar a partir de los valores actuales. Alternativamente, la idea de Chrisotphers anterior sería mi otra sugerencia si tiene problemas para permitir la inserción de identidad.
Buena suerte
PD: no falla porque el orden secuencial en el que se está ejecutando está tratando de actualizar un valor de la lista a un elemento que ya existe en la lista de identificadores. agarrando las pajitas, quizás agregue el número de filas + 1, luego, si eso funciona, reste el número de filas: -S
fuente
Si necesita cambiar las ID ocasionalmente, probablemente sea mejor no usar una columna de identidad. En el pasado, implementamos campos de numeración automática manualmente usando una tabla de 'Contadores' que rastrea la siguiente ID para cada tabla. IIRC lo hicimos porque las columnas de identidad estaban causando daños en la base de datos en SQL2000, pero poder cambiar los ID ocasionalmente era útil para las pruebas.
fuente
Puede insertar nuevas filas con valores modificados y luego eliminar las viejas. El siguiente ejemplo cambia la ID para que sea igual a la clave externa PersonId
fuente
Primero guarde todas las ID y modifíquelas programáticamente a los valores que desee, luego quítelos de la base de datos y luego insértelos nuevamente usando algo similar:
Para uso a granel:
Datos de muestra de file.csv:
Si no lo configura
identity_insert
, obtendrá el siguiente error:fuente
Vi un buen artículo que me ayudó en el último momento. Intenté insertar algunas filas en una tabla que tenía una columna de identidad, pero lo hice mal y tuve que borrarla. Una vez que eliminé las filas, mi columna de identidad cambió. Estaba tratando de encontrar una manera de actualizar la columna que se insertó, pero no tuve suerte. Entonces, mientras buscaba en google encontró un enlace ...
http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- i-update-the-value-of-an.aspx
fuente
Muy buena pregunta, primero necesitamos en IDENTITY_INSERT para la tabla específica, luego ejecutar la consulta de inserción (Debe especificar el nombre de la columna).
Nota: Después de editar la columna de identidad, no olvide desactivar IDENTITY_INSERT. Si no lo ha hecho, no podrá editar la columna de identidad para ninguna otra tabla.
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
fuente