Невозможно вставить явное значение для столбца идентификаторов в таблице 'table', когда для IDENTITY_INSERT установлено значение OFF - PullRequest
287 голосов
/ 26 августа 2009

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

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

Ошибка:

Сервер: Msg 544, Уровень 16, Состояние 1, Строка 1

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

Ответы [ 15 ]

399 голосов
/ 26 августа 2009

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

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

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Hierachy Update',
             1)

SET IDENTITY_INSERT Table1 OFF 
45 голосов
/ 26 августа 2009

не помещайте значение в OperationID, потому что оно будет сгенерировано автоматически. попробуйте это:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
38 голосов
/ 26 августа 2009

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

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

21 голосов
/ 21 февраля 2017

Просто Если вы получили эту ошибку на сервере SQL, запустите этот запрос-

SET IDENTITY_INSERT tableName ON

это работает только одна таблица базы данных Например, если имя таблицы «студент», запрос выглядит следующим образом SET IDENTITY_INSERT student ON

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

18 голосов
/ 17 марта 2016

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

Пример:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
14 голосов
/ 14 марта 2018

Существует два основных способа вставки записей без ошибок:

1) Когда IDENTITY_INSERT выключен. ПЕРВИЧНЫЙ КЛЮЧ «ИД» НЕ ДОЛЖЕН БЫТЬ НАСТОЯЩИМ

2) Когда IDENTITY_INSERT включен. ПЕРВИЧНЫЙ КЛЮЧ "ID" ДОЛЖЕН БЫТЬ НАСТОЯЩИМ

Согласно следующему примеру из той же таблицы, созданной с ИДЕНТИЧНЫМ КЛЮЧОМ::

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);

1) В первом примере вы можете вставить новые записи в таблицу, не получая ошибки, когда IDENTITY_INSERT выключен. ПЕРВИЧНЫЙ КЛЮЧ «ID» НЕ ДОЛЖЕН БЫТЬ ПРЕДСТАВЛЕН * из операторов «INSERT INTO» , и уникальное значение ID будет добавлено автоматически: . Если в этом случае присутствует идентификатор из INSERT, вы получите сообщение об ошибке «Невозможно вставить явное значение для столбца идентификации в таблице ...»

SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE'); 
INSERT INTO Persons (FirstName,LastName) 
VALUES ('JOE','BROWN');

ВЫХОД ТАБЛИЦЫ [dbo]. [Персон.] Будет:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) Во втором примере вы можете вставить новые записи в таблицу, не получая ошибки, когда IDENTITY_INSERT включен. ПЕРВИЧНЫЙ КЛЮЧ "ID" ДОЛЖЕН БЫТЬ ПРЕДСТАВЛЕН * из операторов "INSERT INTO" , пока значение идентификатора еще не существует : если идентификатор не присутствует в INSERT в этом В этом случае вы получите сообщение об ошибке «Необходимо указать явное значение для таблицы столбцов идентификаторов ...»

SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE'); 
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK'); 

ВЫХОД ТАБЛИЦЫ [dbo]. [Персон.] Будет:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN
8 голосов
/ 05 октября 2017

Вы можете просто использовать это утверждение, например, если имя вашей таблицы School . Перед вставкой убедитесь, что для identity_insert установлено значение ON , а после запроса вставки поверните identity_insert OFF

.
SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF
4 голосов
/ 07 марта 2013

Если вы используете liquibase для обновления вашего SQL Server, вы, вероятно, пытаетесь вставить ключ записи в поле autoIncrement. После удаления столбца из вставки ваш скрипт должен запуститься.

<changeSet id="CREATE_GROUP_TABLE" >
    <createTable tableName="GROUP_D">
        <column name="GROUP_ID" type="INTEGER" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="INSERT_UNKNOWN_GROUP" >
    <insert tableName="GROUP_D">    

        <column name="GROUP_ID" valueNumeric="-1"/>
 ...
    </insert>
</changeSet>
3 голосов
/ 03 марта 2016

В вашем запросе есть вышеупомянутый OperationId, которого не должно быть, поскольку он автоматически увеличивается

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

, поэтому ваш запрос будет

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
2 голосов
/ 25 февраля 2015

Ну, я решил довольно легко. Проверьте, совпадают ли ваши первичные ключи с вашими классами, с той лишь разницей, что к первичному ключу добавлен 'ID', или укажите [Key] для первичных ключей, которые не связаны как имя класса.

...