5

Невозможно вставить явное значение для столбца идентичности в таблице 'table', когда IDENTITY_INSERT отключен

14

Я столкнулся с ошибкой при выполнении следующего скрипта. Что означает эта ошибка и как её можно исправить?

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 ответ(ов)

7

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

Чтобы вы могли указывать свои собственные значения для идентичности, вы можете включить вставку идентичности в таблице следующим образом:

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/* Обратите внимание, что указание списка столбцов здесь является ОБЯЗАТЕЛЬНЫМ, а не необязательным */
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Hierachy Update',
             1)

SET IDENTITY_INSERT Table1 OFF 

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

1

Если вы получаете эту ошибку в SQL Server, выполните следующий запрос:

SET IDENTITY_INSERT имяТаблицы ON

Это работает только для одной таблицы в базе данных. Например, если имя таблицы — student, то запрос будет выглядеть так:

SET IDENTITY_INSERT student ON

Если вы сталкиваетесь с этой ошибкой в вашем веб-приложении или используете Entity Framework, сначала выполните этот запрос на SQL Server, затем обновите вашу модель сущностей (.edmx файл) и соберите ваш проект — это должно решить проблему.

0

Не указывайте значение для поля OperationID, так как оно будет сгенерировано автоматически. Попробуйте выполнить запрос следующим образом:

INSERT INTO table (OpDescription, FilterID) VALUES ('Hierachy Update', 1)
0

Будьте очень осторожны с установкой IDENTITY_INSERT на ON. Это плохая практика, за исключением тех случаев, когда база данных находится в режиме обслуживания и работает в режиме одного пользователя. Это влияет не только на вашу операцию вставки, но и на любые другие попытки доступа к таблице со стороны других пользователей.

Почему вы пытаетесь вставить значение в поле идентичности?

0

В вашей сущности для этой таблицы добавьте атрибут DatabaseGenerated над столбцом, для которого настроено автоматическое увеличение (identity insert):

Пример:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь