Невозможно вставить явное значение для столбца идентичности в таблице 'table', когда IDENTITY_INSERT отключен
Я столкнулся с ошибкой при выполнении следующего скрипта. Что означает эта ошибка и как её можно исправить?
Insert table(OperationID, OpDescription, FilterID)
values (20, 'Hierachy Update', 1)
Ошибка:
Server: Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF.
Пожалуйста, подскажите, что я делаю не так и как можно решить эту проблему.
5 ответ(ов)
Вы вставляете значения для столбца OperationId
, который является столбцом с идентичностью.
Чтобы вы могли указывать свои собственные значения для идентичности, вы можете включить вставку идентичности в таблице следующим образом:
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1
/* Обратите внимание, что указание списка столбцов здесь является ОБЯЗАТЕЛЬНЫМ, а не необязательным */
(OperationID,
OpDescription,
FilterID)
VALUES (20,
'Hierachy Update',
1)
SET IDENTITY_INSERT Table1 OFF
Не забудьте отключить вставку идентичности по завершении операции, чтобы возвратиться к стандартному поведению для столбца с идентичностью.
Если вы получаете эту ошибку в SQL Server, выполните следующий запрос:
SET IDENTITY_INSERT имяТаблицы ON
Это работает только для одной таблицы в базе данных.
Например, если имя таблицы — student
, то запрос будет выглядеть так:
SET IDENTITY_INSERT student ON
Если вы сталкиваетесь с этой ошибкой в вашем веб-приложении или используете Entity Framework, сначала выполните этот запрос на SQL Server, затем обновите вашу модель сущностей (.edmx файл
) и соберите ваш проект — это должно решить проблему.
Не указывайте значение для поля OperationID
, так как оно будет сгенерировано автоматически. Попробуйте выполнить запрос следующим образом:
INSERT INTO table (OpDescription, FilterID) VALUES ('Hierachy Update', 1)
Будьте очень осторожны с установкой IDENTITY_INSERT на ON. Это плохая практика, за исключением тех случаев, когда база данных находится в режиме обслуживания и работает в режиме одного пользователя. Это влияет не только на вашу операцию вставки, но и на любые другие попытки доступа к таблице со стороны других пользователей.
Почему вы пытаетесь вставить значение в поле идентичности?
В вашей сущности для этой таблицы добавьте атрибут DatabaseGenerated
над столбцом, для которого настроено автоматическое увеличение (identity insert):
Пример:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Обновление данных в одной таблице из другой на основе совпадения ID
Как вставить перенос строки в строке VARCHAR/NVARCHAR SQL Server
Возможно ли задать условия в Count()?
Какой самый эффективный способ страницировать результаты в SQL Server?
Как оператор GROUP BY обрабатывает значения NULL?