Actualizar valores en la columna identidad


¿Cómo sobreescribo la columna de identidad en MSSQL? Lo intenté:

SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250

Pero vuelvo a

Line 2: Cannot update identity column 'CountryID'.
Author: Salman A, 2010-10-16

5 answers

Está intentando realizar una actualización, no insertar nuevas filas.

Para hacer eso, tendrá que establecer identity_insert EN y copiar la fila que desea actualizar a una nueva fila con el nuevo valor de ID, luego eliminar la fila anterior (suponiendo que no FK lo haga referencia)

Algo parecido a:

set identity_insert GeoCountry on
go

insert into GeoCountry (all columns including IDentity column) 
     select 18, (all columns except IDentity column)
     from GeoCountry where CountryID = 250 

-- Delete will only work if no referencing FK's
delete GeoCountry where CountryID = 250

set identity_insert GeoCountry off
go

[Dado que está tratando de actualizarlo, eso sugeriría que todavía está en uso (es decir, haciendo referencia a FK) y eso hace las cosas más complicadas...]

 57
Author: Mitch Wheat,
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
2012-09-10 10:01:36

No se puede actualizar la columna Identidad en SQL Server. Debe eliminar el registro original y, a continuación, insertar el registro con el valor de identidad porque no hay soporte para actualizar un valor de identidad.

Establecer Identity_Insert [ColumnName] On Insertar identidad e información adicional previamente almacenada en ese registro set Identity_Insert [ColumnName] Off

 10
Author: Gary J.,
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
2012-06-06 13:29:18

Si está tratando de actualizar una columna de identidad, aquí hay un enfoque posible:

  • En SQL Server Management Studio, abra la tabla en la vista diseño, desactive "Especificación de identidad > Es identidad" en la columna
  • Realizar actualizaciones
  • Habilite "Especificación de identidad > Es identidad" en la columna

Haga un SELECT IDENT_CURRENT('<table name>') para ver si devuelve el id más alto que está actualmente presente en la tabla.

 10
Author: Salman A,
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
2014-07-03 03:46:22

Si desea volver a numerar los valores de un campo de identidad, porque por ejemplo los valores se han vuelto locos, simplemente haga lo siguiente:

  • Abrir tabla en modo diseño haga clic en Especificación de identidad

    Marca (es identidad) como NO (Su campo de identidad sigue siendo un PK)

    Cerrar y guardar diseño

  • Abrir tabla en modo de edición Cambie los valores de su campo de identidad como desee (solo tenga en cuenta que no puede tener valores duplicados)

  • Cerrar la mesa y abrirla de nuevo en el modo de diseño Reemplace su campo de identidad (es identidad) a Sí.

    Cierra la tabla y listo.

 0
Author: Ramon Baiges,
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
2018-04-14 11:15:03

También podría hacer esto en una instrucción usando delete into, esto tiene la ventaja de eliminar cualquier error al copiar/mover los datos de la fila, por ejemplo

set identity_insert [dbo].[MyTableName] on

delete from [dbo].[MyTableName]
output 
<new-id-value-here>,
[deleted].[Col1], 
[deleted].[Col2], 
[deleted].[Col3], 
into 
[dbo].[MyTableName] (
[IdColumnName], 
[Col1], 
[Col2], 
[Col3])
where
[IdColumnName]=<old-id-value-here>

set identity_insert [dbo].[MyTableName] off
 0
Author: Ismail Hawayel,
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
2018-07-11 18:03:07