Ich habe den folgenden Fehler, wenn ich das folgende Skript ausführe. Worum geht es bei dem Fehler und wie kann er behoben werden?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Error:
Server: Nachricht 544, Ebene 16, Status 1, Zeile 1
Ein expliziter Wert für die Identitätsspalte kann nicht in die Tabelle 'Tabelle' eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.
sql
sql-server
sybase
Martin Clayton
quelle
quelle
Antworten:
Sie fügen Werte ein, für
OperationId
die es sich um eine Identitätsspalte handelt.Sie können die Identitätseinfügung in der Tabelle wie folgt aktivieren, um Ihre eigenen Identitätswerte anzugeben.
quelle
Setzen Sie keinen Wert auf OperationID, da dieser automatisch generiert wird. Versuche dies:
quelle
Dies funktioniert nur mit einer einzelnen Datenbanktabelle. Wenn z. B. der Tabellenname student ist, sieht die Abfrage folgendermaßen aus
SET IDENTITY_INSERT student ON
quelle
Seien Sie sehr vorsichtig, wenn Sie IDENTITY_INSERT auf ON setzen. Dies ist eine schlechte Vorgehensweise, es sei denn, die Datenbank befindet sich im Wartungsmodus und ist auf Einzelbenutzer eingestellt. Dies betrifft nicht nur Ihre Einfügung, sondern auch die anderer Personen, die versuchen, auf die Tabelle zuzugreifen.
Warum versuchen Sie, einen Wert in ein Identitätsfeld zu setzen?
quelle
Grundsätzlich gibt es zwei verschiedene Möglichkeiten, Datensätze ohne Fehler einzufügen:
1) Wenn IDENTITY_INSERT auf OFF gesetzt ist. Die PRIMARY KEY "ID" darf nicht vorhanden sein
2) Wenn IDENTITY_INSERT auf ON gesetzt ist. Die PRIMARY KEY "ID" muss vorhanden sein
Gemäß dem folgenden Beispiel aus derselben Tabelle, die mit einem IDENTITY PRIMARY KEY erstellt wurde:
1) Im ersten Beispiel können Sie neue Datensätze in die Tabelle einfügen, ohne einen Fehler zu erhalten, wenn IDENTITY_INSERT ausgeschaltet ist. Die PRIMARY KEY "ID" DARF NICHT AUS DEN "INSERT INTO" -Anweisungen vorhanden sein, und ein eindeutiger ID-Wert wird automatisch hinzugefügt : . Wenn die ID in diesem Fall vom INSERT vorhanden ist, wird die Fehlermeldung "Expliziter Wert für Identifizierungsspalte in Tabelle kann nicht eingefügt werden ..." nicht angezeigt.
AUSGABE VON TABELLE [dbo]. [Personen] sind:
2) Im zweiten Beispiel können Sie neue Datensätze in die Tabelle einfügen, ohne dass ein Fehler auftritt, wenn IDENTITY_INSERT aktiviert ist. Der PRIMARY KEY "ID" MUSS in den "INSERT INTO" -Anweisungen vorhanden sein , solange der ID-Wert noch nicht vorhanden ist : Wenn die ID in diesem Fall vom INSERT NICHT vorhanden ist, wird der Fehler "Expliziter Wert muss sein" angezeigt angegeben für Identitätsspaltentabelle ... "
AUSGABE VON TABELLE [dbo]. [Personen] sind:
quelle
Fügen Sie in Ihrer Entität für diese Tabelle das
DatabaseGenerated
Attribut über der Spalte hinzu, für die die Identitätseinfügung festgelegt ist:Beispiel:
quelle
DatabaseGeneratedOption.Identity
, und ich erhalte immer noch den Fehler. Es ist meine eigene Schuld, ich setze Pseudo-IDs in die neuen Zeilen, um sie auf meiner Webseite voneinander zu unterscheiden, und ich hoffe, sie einfach auf Null zu setzen, bevor dieinsert
ausreicht.Sie können diese Anweisung einfach verwenden, wenn Ihr Tabellenname School lautet . Vor dem Einsetzen stellen Sie sicher , identity_insert eingestellt ist ON und nach INSERT - Abfrage wiederum identity_insert OFF
quelle
Wenn Sie Liquibase zum Aktualisieren Ihres SQL Servers verwenden, versuchen Sie wahrscheinlich, einen Datensatzschlüssel in ein AutoIncrement-Feld einzufügen. Wenn Sie die Spalte aus der Einfügung entfernen, sollte Ihr Skript ausgeführt werden.
quelle
Ihre Abfrage enthält eine bereits erwähnte OperationId, die nicht vorhanden sein sollte, da sie automatisch erhöht wird
so wird Ihre Anfrage sein
quelle
Eine andere Situation besteht darin, zu überprüfen, ob der Primärschlüssel den gleichen Namen wie bei Ihren Klassen hat, wobei der einzige Unterschied darin besteht, dass an Ihren Primärschlüssel eine 'ID' angehängt ist, oder [Schlüssel] auf Primärschlüsseln anzugeben, die nicht mit dem wie zusammenhängen Klasse heißt.
quelle
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
in Ihre PrimaryKey-Spalte einfügen und sicherstellen, dass sie auf einen Datentyp int festgelegt ist . Wenn die Spalte der Primärschlüssel ist und in SQL auf IsIDentity auf true gesetzt ist, ist diese Codezeile nicht erforderlich[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
quelle
Die beste Lösung ist die Verwendung von Anmerkungen
GeneratedValue(strategy = ...)
, d. H.Es heißt, dass diese Spalte von der Datenbank mithilfe der IDENTITY-Strategie generiert wird und Sie sich nicht darum kümmern müssen - die Datenbank wird dies tun.
quelle
Wenn Sie dieses Problem haben, während Sie einen SQL-Server mit dem Sequelize-Typoskript npm verwenden, müssen Sie Folgendes
@AutoIncrement
zur ID-Spalte hinzufügen :quelle
Wenn Sie eine Verbindung mit Oracle SQL Developer herstellen, müssen Sie / sqldev: stmt hinzufügen / .
/ sqldev: stmt / set identity_insert TABLE on;
quelle
Ich bin nicht sicher, wozu die "Tabelle einfügen" dient, aber wenn Sie nur versuchen, einige Werte einzufügen, versuchen Sie:
Ich hatte die gleiche Fehlermeldung, aber ich denke, das sollte funktionieren. Die ID sollte automatisch inkrementiert werden, solange es sich um einen Primärschlüssel handelt.
quelle
Ich habe dieses Problem gelöst, indem ich jedes Mal ein neues Objekt erstellt habe, wenn ich der Datenbank etwas hinzufügen möchte.
quelle
Beachten Sie, dass, wenn Sie jede Zeile mit schließen
;
, dieSET IDENTITY_INSERT mytable ON
Befehl für die folgenden Zeilen nicht gilt .dh
eine Abfrage wie
Gibt den Fehler
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.
Aber eine Abfrage wie diese wird funktionieren:
Es scheint, dass der
SET IDENTITY_INSERT
Befehl nur für eine Transaktion gilt und;
das Ende einer Transaktion bedeutet.quelle
Das Problem ergab sich aus der Verwendung von nicht typisiertem DBContext oder DBSet, wenn Sie Interface verwenden und die Methode zum Speichern von Änderungen generisch implementieren
Wenn dies Ihr Fall ist, schlage ich zum Beispiel vor, DBContex stark zu tippen
dann
.Savechanges
wird es funktionierenquelle
Löschen Sie einfach die Tabellen, die in Ihre .dbml-Datei gezogen werden, und ziehen Sie sie erneut. Dann Lösung reinigen> Lösung neu erstellen> Lösung erstellen.
Das hat bei mir funktioniert.
Ich habe die Tabelle nicht selbst erstellt, ich habe VS und SSMS verwendet, ich bin diesem Link für ASP.NET Identity gefolgt: https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ Hinzufügen einer Aspnet-Identität zu einem leeren oder vorhandenen Webformular-Projekt
quelle