web-dev-qa-db-de.com

Ein expliziter Wert für die Identitätsspalte in der Tabelle 'table' kann nicht eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist

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.

270
Jaison

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 
383
pjp

legen Sie keinen Wert auf OperationID, da diese automatisch generiert wird. Versuche dies:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
40
Wael Dalloul

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? 

38
HLGEM

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

21
Umang Patwa

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; }
17
user902490

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
11
QA Specialist

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
9
user5948411

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>
4
iowatiger08

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)
3
Onkar_M18

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.

  1. Dies tritt auf, wenn Sie eine (Primärschlüssel-) Spalte haben, die in SQL nicht auf Is Identity auf true festgelegt ist, und Sie beim Einfügen keinen expliziten Wert übergeben. Es dauert die erste Zeile, dann können Sie die zweite Zeile nicht einfügen, der Fehler wird angezeigt. Dies kann korrigiert werden, indem Sie diese Codezeile [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)]
  2. dies ist auch der Fall, wenn Sie eine Spalte haben, die nicht der Primärschlüssel ist, in SQL die Is Identity auf true gesetzt ist und in Ihrer EF diese Codezeile nicht hinzugefügt haben. [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;

0
Hao Deng

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.

0
Matthew