Ich habe den folgenden Fehler, wenn ich das folgende Skript ausführte. 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 in der Tabelle 'table' kann nicht eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.
Sie fügen Werte für OperationId
ein, das eine Identitätsspalte ist.
Sie können auf diese Weise die Identitätsinsertion für die Tabelle aktivieren, um Ihre eigenen Identitätswerte anzugeben.
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
legen Sie keinen Wert auf OperationID, da diese automatisch generiert wird. Versuche dies:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
Seien Sie sehr vorsichtig, wenn Sie IDENTITY_INSERT auf ON setzen. Dies ist eine schlechte Praxis, wenn sich die Datenbank nicht im Wartungsmodus befindet und auf Einzelbenutzer eingestellt ist. Dies betrifft nicht nur Ihre Einfügung, sondern auch die aller anderen Personen, die versuchen, auf die Tabelle zuzugreifen.
Warum versuchen Sie, einen Wert in ein Identitätsfeld einzugeben?
Wenn Sie diesen Fehler auf dem SQL-Server erhalten, führen Sie diese Abfrage aus.
SET IDENTITY_INSERT tableName ON
z. B. Wenn der Tabellenname Student ist, sieht die Abfrage folgendermaßen ausSET IDENTITY_INSERT student ON
Wenn Sie diesen Fehler in Ihrer Webanwendung erhalten oder das Entity Framework verwenden, führen Sie zuerst diese Abfrage auf dem SQL Server aus und aktualisieren Sie Ihr Entitätsmodell (
.edmx file
) und erstellen Sie Ihr Projekt . Dieser Fehler wird behoben
Fügen Sie in Ihrer Entität für diese Tabelle das DatabaseGenerated
-Attribut über der Spalte hinzu, für die die Identitätseinsetzung festgelegt ist:
Beispiel:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Es gibt grundsätzlich zwei Möglichkeiten, Datensätze ohne Fehler einzufügen:
1) Wenn IDENTITY_INSERT auf OFF gesetzt ist. Der Primärschlüssel "ID" darf nicht vorhanden sein
2) Wenn IDENTITY_INSERT auf ON gesetzt ist. Der Primärschlüssel "ID" muss vorhanden sein
Wie im folgenden Beispiel aus derselben Tabelle, die mit einem IDENTITY PRIMARY KEY erstellt wurde:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
1) Im ersten Beispiel können Sie neue Datensätze in die Tabelle einfügen, ohne einen Fehler zu erhalten, wenn IDENTITY_INSERT auf OFF gesetzt ist. Der PRIMARY KEY "ID" DARF NICHT DURCHSTEHEN aus den "INSERT INTO" -Anweisungen und ein eindeutiger ID-Wert wird automatisch hinzugefügt: . Wenn in diesem Fall die ID von INSERT vorhanden ist, erhalten Sie die Fehlermeldung "Es kann kein expliziter Wert für die Identifizierungsspalte in der Tabelle eingefügt werden ...".
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE');
INSERT INTO Persons (FirstName,LastName)
VALUES ('JOE','BROWN');
ERGEBNIS von TABELLE [dbo]. [Personen] werden sein:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2) Im zweiten Beispiel können Sie neue Datensätze in die Tabelle einfügen, ohne einen Fehler zu erhalten, wenn IDENTITY_INSERT auf ON gesetzt ist. Die PRIMARY KEY "ID" MUSS PRÄSENTIEREN aus den "INSERT INTO" -Anweisungen solange der ID-Wert noch nicht existiert : Wenn die ID in diesem Fall NICHT von der INSERT vorhanden ist, werden Sie dies tun Fehler erhalten "Expliziter Wert muss für Identitätsspaltentabelle angegeben werden ..."
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');
ERGEBNIS von TABELLE [dbo]. [Personen] werden sein:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
sie können diese Anweisung einfach verwenden, wenn Ihr Tabellenname Schule ist. Stellen Sie vor dem Einfügen sicher, dass identity_insert auf ON gesetzt ist, und deaktivieren Sie identity_insert OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF
Wenn Sie liquibase zum Aktualisieren von SQL Server 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.
<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>
In Ihrer Abfrage befindet sich die zuvor erwähnte OperationId, die nicht vorhanden sein sollte, da sie automatisch erhöht wird
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
so wird deine abfrage sein
Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
Nun, ich habe mein Problem ziemlich einfach gelöst. Überprüfen Sie, ob Ihr Primärschlüssel mit Ihren Klassen identisch ist. Der einzige Unterschied besteht darin, dass Ihrem Primärschlüssel eine 'ID' angehängt ist, oder geben Sie [Schlüssel] für Primärschlüssel an, die sich nicht auf den Schlüssel beziehen Klasse wird benannt.
Die beste Lösung ist die Verwendung von Annotation GeneratedValue(strategy = ...)
, d.h.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;
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.
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
in Ihre PrimaryKey-Spalte einfügen und sicherstellen, dass sie auf den Datentyp int festgelegt ist. Wenn die Spalte der Primärschlüssel ist und IsIDentity in SQL auf true gesetzt ist, ist diese Codezeile nicht erforderlich. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Wenn Sie Oracle SQL Developer für die Verbindung verwenden, denken Sie daran, / sqldev: stmt / hinzuzufügen.
/ sqldev: stmt / set identity_insert TABLE on;
Ich bin nicht sicher, was die "Insert Table" ist.
Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);
Ich hatte die gleiche Fehlermeldung, aber ich denke, das sollte funktionieren. Die ID sollte automatisch automatisch erhöht werden, solange es sich um einen Primärschlüssel handelt.