Как переопределить столбец идентификаторов в MSSQL? Я пробовал:
SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250
Но я вернусь
Line 2: Cannot update identity column 'CountryID'.
Как переопределить столбец идентификаторов в MSSQL? Я пробовал:
SET IDENTITY_INSERT GeoCountry ON
UPDATE GeoCountry SET CountryID = 18 WHERE CountryID = 250
Но я вернусь
Line 2: Cannot update identity column 'CountryID'.
Вы пытаетесь выполнить обновление, а не вставлять новые строки.
Для этого вам нужно установить 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), и это усложняет ситуацию...]
Вы не можете обновить столбец Identity в SQL Server. Вы должны удалить исходную запись, а затем вставить запись с идентификатором, потому что нет поддержки для обновления значения удостоверения.
установить Identity_Insert [ColumnName] Вкл. Вставьте идентификатор и дополнительную информацию, ранее сохраненную в этой записи set Identity_Insert [ColumnName] Выкл.
Если вы пытаетесь обновить столбец идентификатора, это один из возможных способов:
Сделайте SELECT IDENT_CURRENT('<table name>')
, чтобы увидеть, возвращает ли он самый высокий идентификатор, который в настоящее время присутствует в таблице.
Если вы хотите повторно использовать значения поля идентификатора, потому что, например, значения сошли с ума, просто выполните следующие действия:
открыть таблицу в режиме дизайна, нажмите "Идентификация"
mark (is identity) как NO (ваше поле идентификации по-прежнему является PK)
закрыть и сохранить дизайн
открыть таблицу в режиме редактирования. Измените значения поля "Идентификация" по желанию (просто помните, что вы не можете иметь повторяющиеся значения)
Закройте таблицу и снова откройте ее в режиме разработки. Замените свое поле идентификации (личность) на "Да".
Закройте стол, и все готово.
Вы также можете сделать это в одном выражении, используя 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
Вы не можете обновить существующий столбец идентификаторов. Однако это обходной путь, который я использую:
-- 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