У меня есть следующая ошибка, когда я выполняю следующий script. Что такое ошибка и как ее можно решить?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Ошибка:
Сервер: Msg 544, уровень 16, состояние 1, строка 1
Невозможно вставить явное значение для столбца идентификатора в таблице "table", если для параметра IDENTITY_INSERT установлено значение OFF.
Ответ 1
Вы вставляете значения для 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
Ответ 2
не присваивать значение OperationID, потому что он будет автоматически сгенерирован. попробуйте следующее:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
Ответ 3
Будьте очень осторожны при установке параметра IDENTITY_INSERT в положение ON. Это плохая практика, если база данных не находится в режиме обслуживания и не установлена на одного пользователя. Это влияет не только на вашу вставку, но и на тех, кто пытается получить доступ к таблице.
Почему вы пытаетесь поместить значение в поле идентификации?
Ответ 4
Проще говоря, если вы получаете эту ошибку на сервере SQL, запустите этот query-
SET IDENTITY_INSERT tableName ON
это работает только для одной таблицы базы данных, например, если имя таблицы "ученик", запрос выглядит следующим образом: SET IDENTITY_INSERT student ON
Если вы получаете эту ошибку в своем веб-приложении или используете Entity Framework, сначала запустите этот запрос на SQL-сервере и обновите вашу модель .edmx file
(.edmx file
) и постройте свой проект, и эта ошибка будет устранена.
Ответ 5
Есть в основном 2 разных способа вставить записи без ошибки:
1) Когда IDENTITY_INSERT установлен на OFF. ПЕРВИЧНЫЙ КЛЮЧ "ИД" НЕ ДОЛЖЕН БЫТЬ НАСТОЯЩИМ
2) Когда IDENTITY_INSERT включен. ПЕРВИЧНЫЙ КЛЮЧ "ИД" ДОЛЖЕН БЫТЬ НАСТОЯЩИМ
Согласно следующему примеру из той же таблицы, созданной с ИДЕНТИЧНЫМ КЛЮЧОМ:
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", пока значение ID еще не существует: если в этом случае ID не присутствует в 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
Ответ 6
В вашей сущности для этой таблицы добавьте атрибут DatabaseGenerated
над столбцом, для которого установлена вставка идентификатора:
Пример:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Ответ 7
вы можете просто использовать этот оператор, например, если ваше имя таблицы Школа.
Перед установкой убедитесь, что для параметра identity_insert установлено значение ВКЛ, и после запроса вставки поверните идентификатор_иннеста ВЫКЛ
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
Ответ 8
Если вы используете Liquibase для обновления вашего SQL Server, скорее всего, вы попытаетесь вставить ключ записи в поле autoIncrement. Удалив столбец из вставки, ваш script должен работать.
<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>
Ответ 9
В запросе есть предварительно упомянутый OperationId, который не должен присутствовать, поскольку он автоматически увеличивается
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
поэтому ваш запрос будет
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
Ответ 10
Хорошо, я решил, что мой довольно простой. Убедитесь, что ваш первичный ключ с тем же именем совпадает с вашими классами, где единственное различие заключается в том, что ваш первичный ключ имеет прикрепленный к нему ID или указать [Key] на первичных ключах, которые не связаны как называется класс.
Ответ 11
Лучшее решение - использовать аннотацию GeneratedValue(strategy = ...)
, т.е.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
там написано, что этот столбец генерируется базой данных с использованием стратегии IDENTITY, и вам не нужно об этом заботиться - база данных сделает это.
Ответ 12
- Это происходит, когда у вас есть столбец (Первичный ключ), для которого в SQL не установлено значение Is Identity, равное true, и вы не передаете его явное значение во время вставки. Он займет первую строку, затем вы не сможете вставить вторую строку, появится ошибка. Это можно исправить, добавив эту строку кода
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
в столбец PrimaryKey и убедитесь, что для него задан тип данных int. Если столбец является первичным ключом и для IsIDentity установлено значение true в SQL, для этой строки кода нет необходимости [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- это также происходит, когда у вас есть столбец, который не является первичным ключом, в SQL, для которого установлено значение Is Identity в true, и в EF вы не добавили эту строку кода
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Ответ 13
И если вы используете Oracle SQL Developer для подключения, не забудьте добавить /sqldev: stmt/
/sqldev: stmt/set identity_insert TABLE on;
Ответ 14
Я не уверен, что использовать для "Insert Table", но если вы просто пытаетесь вставить некоторые значения, попробуйте:
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
У меня появилось такое же сообщение об ошибке, но я думаю, что это должно сработать. Идентификатор должен автоматически увеличиваться автоматически, если это первичный ключ.
Ответ 15
Проблема связана с использованием непечатаемого DBContext или DBSet, если вы используете интерфейс и реализуете метод savechanges в общем виде
Если это ваш случай, я предлагаю строго типизировать DBContex, например
MyDBContext.MyEntity.Add(mynewObject)
тогда .Savechanges
будет работать
Ответ 16
Просто удалите таблицы, которые перетаскиваются в файл .dbml, и снова перетащите их. Затем Очистить решение> Восстановить решение> Построить решение.
Вот что сработало для меня.
Я не сделал таблицу самостоятельно, я использовал VS и SSMS, я перешел по этой ссылке для идентификации ASP.NET: https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/добавление-САШИ-идентичность к ан-пустому или существовавшему-веб-форм-проект