Как программно изменить значения столбцов идентификатора?

У меня есть база данных MS SQL 2005 с таблицей Test со столбцом ID. ID является столбцом идентичности.

У меня есть строки в этой таблице, и все они имеют соответствующее значение автоинкрементного ID.

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

ID = ID + 1

Но когда я делаю это, я получаю сообщение об ошибке:

Cannot update identity column 'ID'.

Я пробовал это:

ALTER TABLE Test NOCHECK CONSTRAINT ALL 
set identity_insert ID ON

Но это не решает проблему.

Мне нужно установить идентификатор в этот столбец, но мне также нужно время от времени менять значения. Поэтому мой вопрос заключается в том, как выполнить эту задачу.

Ответ 1

Вам нужно

set identity_insert YourTable ON

Затем удалите свою строку и вставьте ее с другим идентификатором.

После того, как вы сделали вкладку, не забудьте выключить идентификатор

set identity_insert YourTable OFF

Ответ 2

Значения столбцов

IDENTITY неизменяемы.

Однако можно переключить метаданные таблицы, чтобы удалить свойство IDENTITY, выполнить обновление и затем вернуться.

Предполагая следующую структуру

CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test 
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

Затем вы можете сделать

/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)

/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;

/*Do the update*/
UPDATE Temp SET ID = ID + 1;

/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;

/*ID values have been updated*/
SELECT *
FROM Test

/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
    DROP TABLE Temp /*Drop obsolete table*/

В SQL Server 2012 может быть добавлен автоинкрементный столбец, который также может быть обновлен более просто с помощью SEQUENCES

CREATE SEQUENCE Seq
    AS INT
    START WITH 1
    INCREMENT BY 1

CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

UPDATE Test2 SET ID+=1

Ответ 3

В интерфейсе пользовательского интерфейса в диспетчере SQL Server 2005 измените столбец, чтобы удалить свойство autonumber (identity) столбца (выберите таблицу, щелкнув правой кнопкой мыши и выберите "Дизайн" ).

Затем запустите свой запрос:

UPDATE table SET Id = Id + 1

Затем перейдите и добавьте свойство autonumber обратно в столбец.

Ответ 4

Во-первых, установка IDENTITY_INSERT в этом случае не будет работать для того, что вам требуется (оно используется для вставки новых значений, например, для запирания пробелов).

Выполнение операции через графический интерфейс просто создает временную таблицу, копирует все данные в новую таблицу без поля идентификации и переименовывает таблицу.

Ответ 5

Это можно сделать с помощью временной таблицы.

Идея

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

SQL-запросы

Скажем, ваша таблица test имеет два дополнительных столбца (column2 и column3) и что есть две таблицы, имеющие внешние ключи, ссылающиеся на test, называемые foreign_table1 и foreign_table2 (поскольку проблемы в реальной жизни никогда просто).

alter table test nocheck constraint all;
alter table foreign_table1 nocheck constraint all;
alter table foreign_table2 nocheck constraint all;
set identity_insert test on;

select id + 1 as id, column2, column3 into test_copy from test v;
delete from test;
insert into test(id, column2, column3)
select id, column2, column3 from test_copy

alter table test check constraint all;
alter table foreign_table1 check constraint all;
alter table foreign_table2 check constraint all;
set identity_insert test off;
drop table test_copy;

Что это.

Ответ 6

DBCC CHECKIDENT ('databasename.dbo.orders, RESEED, 999) вы можете изменить любой номер столбца идентификатора с помощью этой команды, а также вы можете запустить этот номер поля из каждого числа, которое вы хотите. Например, в моей команде я прошу начать с 1000 (999 + 1) надеюсь, что этого будет достаточно... удачи

Ответ 7

Если столбец не является PK, вы всегда можете создать столбец NEW в таблице с добавочными числами, отбросить оригинал, а затем изменить новый, чтобы быть старым.

Любопытно, почему вам, возможно, понадобится это сделать... больше всего мне приходилось работать с колонками Identity, чтобы заполнить номера, и я просто закончил использование DBCC CHECKIDENT (имя_таблицы, RESEED, newnextnumber)

Удачи!

Ответ 8

Модификация идентификатора может завершиться неудачно в зависимости от ряда факторов, в основном вращающихся вокруг объектов/отношений, связанных с столбцом id. Похоже, что дизайн db является проблемой здесь, поскольку идентификатор должен редко меняться (я уверен, что у вас есть свои причины и каскадирование изменений). Если вам действительно нужно время от времени менять id, я бы предложил либо создать новый столбец id, который не является основным ключом/автономерами, которые вы можете управлять собой и генерировать из текущих значений. В качестве альтернативы, идея Chrisotphers выше была бы моим другим предложением, если у вас возникли проблемы с возможностью вставки идентификатора.

Удачи.

PS это не так, потому что последовательный порядок, в котором он работает, пытается обновить значение в списке до элемента, который уже существует в списке идентификаторов? сжимая на соломинках, возможно, добавьте количество строк + 1, а затем, если это вычитает количество строк: -S

Ответ 9

Если вам нужно иногда менять идентификаторы, лучше не использовать столбец идентификатора. В прошлом мы реализовали поля автонабора вручную, используя таблицу "Счетчики", которая отслеживает следующий идентификатор для каждой таблицы. IIRC мы сделали это, потому что столбцы идентификации вызывали повреждение базы данных в SQL2000, но возможность изменения идентификаторов иногда была полезна для тестирования.

Ответ 10

Вы можете вставить новые строки с измененными значениями, а затем удалить старые строки. Следующий пример изменения ID должен быть таким же, как внешний ключ PersonId

SET IDENTITY_INSERT [PersonApiLogin] ON

INSERT INTO [PersonApiLogin](
       [Id]
      ,[PersonId]
      ,[ApiId]
      ,[Hash]
      ,[Password]
      ,[SoftwareKey]
      ,[LoggedIn]
      ,[LastAccess])
SELECT [PersonId]
      ,[PersonId]
      ,[ApiId]
      ,[Hash]
      ,[Password]
      ,[SoftwareKey]
      ,[LoggedIn]
      ,[LastAccess]
FROM [db304].[dbo].[PersonApiLogin]
GO

DELETE FROM [PersonApiLogin]
WHERE [PersonId] <> ID
GO
SET IDENTITY_INSERT [PersonApiLogin] OFF
GO

Ответ 11

Сначала сохраните все идентификаторы и измените их программно на значения, которые вы wan't, затем удалите их из базы данных и затем вставьте их снова, используя что-то подобное:

use [Name.Database]
go
set identity_insert [Test] ON
insert into [dbo].[Test]
           ([Id])
     VALUES
           (2)
set identity_insert [Test] OFF

Для использования объемной вставки:

use [Name.Database]
go
set identity_insert [Test] ON
BULK INSERT [Test]
FROM 'C:\Users\Oscar\file.csv'
WITH (FIELDTERMINATOR = ';',
      ROWTERMINATOR = '\n',
      KEEPIDENTITY)
set identity_insert [Test] OFF

Пример данных из файла .csv:

2;
3;
4;
5;
6;

Если вы не отключите identity_insert, вы получите следующую ошибку:

Невозможно вставить явное значение для столбца идентификатора в таблице "Тест", если IDENTITY_INSERT установлен в положение OFF.

Ответ 12

Я увидел хорошую статью, которая помогла мне в последний момент. Я пытался вставить несколько строк в таблицу, в которой был столбец с идентификатором, но сделал это неправильно и нужно удалить обратно. Как только я удалил строки, мой столбец идентичности был изменен. Я пытался найти способ обновить столбец, который был вставлен, но не повезло. Итак, во время поиска в google найдена ссылка..

  • Удалены столбцы, которые были неправильно вставлены
  • Используйте силовую вставку, используя идентификатор вкл/выкл (объясняется ниже)

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

Ответ 13

Очень приятный вопрос: сначала нужно на IDENTITY_INSERT для конкретной таблицы, после чего запустите запрос вставки (обязательно укажите имя столбца).

Примечание. После редактирования столбца идентификации не забудьте выключить идентификатор IDENTITY_INSERT. Если вы этого не сделали, вы не сможете редактировать столбец идентификатора для любой другой таблицы.

SET IDENTITY_INSERT Emp_tb_gb_Menu ON
     INSERT Emp_tb_gb_Menu(MenuID) VALUES (68)
SET IDENTITY_INSERT Emp_tb_gb_Menu OFF

http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html