2010-10-16 18 views

Respuesta

55

Usted está tratando de realizar una actualización, no insertar nuevas filas.

Con el fin de hacer eso, usted tendrá que establecer identity_insert EN y copiar la fila que desea actualizar a una nueva fila con el nuevo valor de ID, a continuación, elimine la fila de edad (suponiendo que no hay FK hace referencia a ella)

Algo a lo largo de las líneas de:

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 

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

+0

Esto es demasiado detallado. Demasiada explicación para un simple "No se puede". necesita volver a insertar con nueva identidad. –

+5

@Amir M .: Incorrecto. –

10

No puede actualizar la columna de identidad en SQL Server. Debe eliminar el registro original, luego Insertar el registro con el valor de Identidad porque no hay soporte para actualizar un valor de identidad.

SET_IDENTITY_INSERT [ColumnName] En identidad Insertar y la información adicional almacenada previamente en ese conjunto de registros Identity_Insert [ColumnName] Off

+2

+1 IMO esta es la respuesta correcta. Cuando se plantea la pregunta "¿Cómo actualizo el valor de identidad?", Es un detalle importante que, de hecho, no se puede ACTUALIZAR el valor, pero se debe ELIMINAR y volver a INSERTAR. La respuesta aceptada falla a este respecto. – alan

10

Si está intentando actualizar una columna de identidad aquí es un enfoque posible:

  • en SQL Server Management Studio, abra la tabla en vista diseño, desactivar "identidad Especificación> es la identidad" en la columna
  • Realizar actualizaciones
  • Habilitar "Identidad Especificación> es la identidad" en la columna

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

+0

Este método es la mejor manera de hacerlo si tiene claves externas con actualizaciones en cascada porque obtiene las actualizaciones para "gratis". – Jacob

-1

No puede actualizar una columna de identidad existente. Sin embargo, esta es la solución que uso:

-- create copy of the existing table 
SELECT * INTO old_tablename FROM tablename 

-- delete everything in the original table 
DELETE FROM tablename 

-- temporarily allow updating identity columns 
SET IDENTITY_INSERT tablename ON; 

-- copy data into the existing table from the copy of the existing table 
-- modify the select statement to put whatever you want in the identity column 
-- of course you can join to other tables etc to get the int for your id column 
INSERT INTO tablename (
    id_column, 
    column2, 
    column3 
) SELECT 
    old_id, 
    column2, 
    column3 
FROM old_tablename; 

-- prevent updating identity columns in future 
SET IDENTITY_INSERT tablename OFF; 

-- drop the copied table once you've tested that everything worked ok 
-- DROP TABLE old_tablename 
+0

ELIMINAR De nombre de tabla eliminará todas las relaciones si se activó la eliminación en cascada. Si no tiene ninguna relación, esto funcionaría, pero borrar una tabla completa solo para actualizar algunos registros no parece ser algo bueno. – ManOVision

Cuestiones relacionadas