Подтвердить что ты не робот

Обновить значения в столбце идентификации

Как переопределить столбец идентификаторов в MSSQL? Я пробовал:

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

Но я вернусь

Line 2: Cannot update identity column 'CountryID'.
4b9b3361

Ответ 1

Вы пытаетесь выполнить обновление, а не вставлять новые строки.

Для этого вам нужно установить identity_insert ON и скопировать строку, которую вы хотите обновить, в новую строку с новым значением ID, а затем удалить старую строку (если FK не ссылается на нее)

Что-то по строкам:

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

[Учитывая, что вы пытаетесь его обновить, это предполагает, что он все еще используется (т.е. путем ссылки на FK), и это усложняет ситуацию...]

Ответ 2

Вы не можете обновить столбец Identity в SQL Server. Вы должны удалить исходную запись, а затем вставить запись с идентификатором, потому что нет поддержки для обновления значения удостоверения.

установить Identity_Insert [ColumnName] Вкл. Вставьте идентификатор и дополнительную информацию, ранее сохраненную в этой записи set Identity_Insert [ColumnName] Выкл.

Ответ 3

Если вы пытаетесь обновить столбец идентификатора, это один из возможных способов:

  • В SQL Server Management Studio откройте таблицу в представлении дизайна, отключите "Identity Specification > Is Identity" в столбце
  • Выполнять обновления
  • В столбце включить "Identity Specification > Is Identity"

Сделайте SELECT IDENT_CURRENT('<table name>'), чтобы увидеть, возвращает ли он самый высокий идентификатор, который в настоящее время присутствует в таблице.

Ответ 4

Если вы хотите повторно использовать значения поля идентификатора, потому что, например, значения сошли с ума, просто выполните следующие действия:

  • открыть таблицу в режиме дизайна, нажмите "Идентификация"

    mark (is identity) как NO (ваше поле идентификации по-прежнему является PK)

    закрыть и сохранить дизайн

  • открыть таблицу в режиме редактирования. Измените значения поля "Идентификация" по желанию (просто помните, что вы не можете иметь повторяющиеся значения)

  • Закройте таблицу и снова откройте ее в режиме разработки. Замените свое поле идентификации (личность) на "Да".

    Закройте стол, и все готово.

Ответ 5

Вы также можете сделать это в одном выражении, используя delete in, это позволяет исключить любую ошибку, копируя/перемещая данные строки, например

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

Ответ 6

Вы не можете обновить существующий столбец идентификаторов. Однако это обходной путь, который я использую:

-- 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