У меня есть база данных MS SQL 2005 с таблицей Test
с колонкой ID
. ID
это столбец идентичности.
У меня есть строки в этой таблице, и все они имеют соответствующие ID автоматически увеличенное значение.
Теперь я хотел бы изменить каждый идентификатор в этой таблице следующим образом:
ID = ID + 1
Но когда я делаю это, я получаю ошибку:
Невозможно обновить идентификационный столбец «ID».
Я пробовал это:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Но это не решает проблему.
Мне нужно установить идентичность для этого столбца, но мне также нужно время от времени менять значения. Поэтому мой вопрос заключается в том, как выполнить эту задачу.
sql-server
sql-server-2005
tsql
identity
sql-server-2005-express
Томаш Смыковский
источник
источник
#temp
таблица, которую вы затем отбрасываете, это еще один шаг, который вы не учитывали здесь.IDENTITY
значения столбца неизменны.Однако можно изменить метаданные таблицы, чтобы удалить
IDENTITY
свойство, выполнить обновление, а затем вернуться обратно.Предполагая следующую структуру
Тогда вы можете сделать
В SQL Server 2012 возможно иметь столбец с автоинкрементом, который также может быть обновлен более просто с помощью
SEQUENCES
источник
С помощью пользовательского интерфейса в диспетчере SQL Server 2005 измените столбец, удалите свойство столбца autonumber (identity) (выберите таблицу, щелкнув по ней правой кнопкой мыши и выбрав «Дизайн»).
Затем запустите ваш запрос:
Затем перейдите и добавьте свойство autonumber обратно в столбец.
источник
Id
значения Auto Identity были отключены на 1.Во-первых, установка IDENTITY_INSERT в этом случае не будет работать для того, что вам нужно (оно используется для вставки новых значений, таких как пробелы).
Выполнение операции через графический интерфейс пользователя просто создает временную таблицу, копирует все данные в новую таблицу без поля идентификации и переименовывает таблицу.
источник
Это можно сделать с помощью временной таблицы.
Идея
SQL-запросы
Допустим, в вашей
test
таблице есть два дополнительных столбца (column2
иcolumn3
) и что в 2 таблицах есть ссылки на внешние ключи,test
вызываемыеforeign_table1
иforeign_table2
(потому что реальные проблемы никогда не бывают простыми).Вот и все.
источник
DBCC CHECKIDENT ('databasename.dbo.orders', RESEED, 999) вы можете изменить любой номер столбца идентификаторов с помощью этой команды, а также вы можете начать этот номер поля с любого числа, которое вы хотите. Например, в моей команде я прошу начать с 1000 (999 + 1) надеюсь, что этого будет достаточно ... удачи
источник
Если столбец не является PK, вы всегда можете создать НОВЫЙ столбец в таблице с увеличенными числами, отбросить оригинал и затем заменить новый на старый.
Любопытно, почему вам может понадобиться это сделать ... большинство из тех, что мне приходилось использовать для столбцов Identity, заключалось в обратной засыпке чисел, и я только что закончил с использованием DBCC CHECKIDENT (tablename, RESEED, newnextnumber)
удачи!
источник
Изменение идентичности может завершиться неудачей в зависимости от ряда факторов, в основном вращающихся вокруг объектов / отношений, связанных со столбцом id. Кажется, что дизайн БД так же важен, как и ID, если они вообще меняются, редко, если они меняются (я уверен, что у вас есть свои причины и вы делаете изменения). Если вам действительно нужно время от времени менять идентификаторы, я бы предложил создать новый столбец фиктивных идентификаторов, который не является первичным ключом / автономным номером, которым вы можете управлять самостоятельно и генерировать из текущих значений. С другой стороны, идея Chrisotphers выше была бы моим другим предложением, если у вас есть проблемы с разрешением вставки идентификационной информации.
Удачи
PS это не сбой, потому что последовательный порядок, в котором он выполняется, пытается обновить значение в списке до элемента, который уже существует в списке идентификаторов? хватаясь за соломинку, возможно, добавьте количество строк + 1, затем, если это сработает, вычтите количество строк: -S
источник
Если вам необходимо время от времени менять идентификаторы, лучше не использовать столбец идентификаторов. В прошлом мы реализовывали поля автонумерации вручную, используя таблицу «Счетчики», которая отслеживает следующий идентификатор для каждой таблицы. IIRC мы сделали это, потому что столбцы идентификаторов вызывали повреждение базы данных в SQL2000, но возможность изменения идентификаторов иногда была полезна для тестирования.
источник
Вы можете вставить новые строки с измененными значениями, а затем удалить старые строки. В следующем примере идентификатор изменения должен совпадать с внешним ключом PersonId
источник
Сначала сохраните все идентификаторы и программно измените их на значения, которые вы не хотите, затем удалите их из базы данных, а затем вставьте их снова, используя нечто похожее:
Для массового использования вставки:
Пример данных из файла file.csv:
Если вы не
identity_insert
отключите, вы получите следующую ошибку:источник
Я видел хорошую статью, которая помогла мне в последний момент ... Я пытался вставить несколько строк в таблицу, в которой был столбец идентификаторов, но сделал это неправильно и пришлось удалить обратно. Как только я удалил строки, мой столбец идентификаторов изменился. Я пытался найти способ обновить столбец, который был вставлен, но - не повезло. Итак, при поиске в гугле нашел ссылку ..
http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- я-обновление-заместитель стоимости из-an.aspx
источник
Очень хороший вопрос, сначала нам нужно на в IDENTITY_INSERT для конкретной таблицы, после чего выполнить запрос вставки (Необходимо указать имя столбца).
Примечание. После редактирования столбца идентификаторов не забудьте отключить IDENTITY_INSERT. Если вы этого не сделали, вы не сможете редактировать столбец идентификаторов для любой другой таблицы.
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
источник