web-dev-qa-db-fra.com

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'table' lorsque IDENTITY_INSERT est défini sur OFF

J'ai l'erreur ci-dessous lorsque j'exécute le script suivant. En quoi consiste l'erreur et comment la résoudre?

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

Erreur:

Serveur: Msg 544, niveau 16, état 1, ligne 1

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'table' lorsque IDENTITY_INSERT est défini sur OFF.

270
Jaison

Vous insérez des valeurs pour OperationId qui est une colonne identity.

Vous pouvez activer l'insertion d'identité sur la table comme ceci afin de pouvoir spécifier vos propres valeurs d'identité.

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

ne mettez pas de valeur dans OperationID car il sera généré automatiquement. essaye ça:

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

Veillez à ne pas définir IDENTITY_INSERT sur ON. Ceci est une mauvaise pratique à moins que la base de données ne soit en mode maintenance et définie sur un utilisateur unique. Cela affecte non seulement votre insertion, mais également tous ceux qui essaient d'accéder à la table. 

Pourquoi essayez-vous de mettre une valeur dans un champ d'identité? 

38
HLGEM

Si vous obtenez cette erreur sur le serveur SQL, lancez cette requête. 

SET IDENTITY_INSERT tableName ON

par exemple, si le nom de la table est étudiant, la requête ressemble à ceci SET IDENTITY_INSERT student ON 

Si vous obtenez cette erreur sur votre application Web ou si vous utilisez une structure d'entité, lancez d'abord cette requête sur le serveur SQL et mettez à jour votre modèle entity (.edmx file) et générez votre project. Cette erreur sera résolue.

21
Umang Patwa

Dans votre entité pour cette table, ajoutez l'attribut DatabaseGenerated au-dessus de la colonne pour laquelle l'insertion d'identité est définie:

Exemple:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
17
user902490

Il y a fondamentalement 2 manières différentes d'insérer des enregistrements sans erreur:

1) Lorsque IDENTITY_INSERT est défini sur OFF. La clé principale "ID" ne doit pas être présent

2) Lorsque IDENTITY_INSERT est défini sur ON. La clé principale "ID" doit être présent

Selon l'exemple suivant de la même table créée avec une clé IDENTITY PRIMARY:

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

1) Dans le premier exemple, vous pouvez insérer de nouveaux enregistrements dans la table sans générer d'erreur lorsque IDENTITY_INSERT est désactivé. La clé primaire "ID" NE DOIT PAS ÊTRE PRÉSENTE à partir des instructions "INSERT INTO" et une valeur d'identification unique sera ajoutée automatiquement: . Si l'ID est présent à partir de l'INSERT dans ce cas, vous obtiendrez l'erreur "Impossible d'insérer une valeur explicite pour identifier la colonne dans la table ..."

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

SORTIE de la TABLE [dbo]. [Personnes] sera:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) Dans le deuxième exemple, vous pouvez insérer de nouveaux enregistrements dans la table sans générer d'erreur lorsque IDENTITY_INSERT est activé. La clé primaire "ID" DOIT ÊTRE PRÉSENTE à partir des instructions "INSERT INTO" tant que la valeur de l'ID n'existe pas déjà : obtenir l'erreur "La valeur explicite doit être spécifiée pour la table de colonnes d'identité ..."

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'); 

SORTIE de la TABLE [dbo]. [Personnes] sera:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN
11
QA Specialist

vous pouvez simplement utiliser cette instruction, par exemple, si le nom de votre table est School . Avant l'insertion, assurez-vous que identity_insert est défini surSURet après avoir inséré la requête, activez identity_insertOFF

SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF
8
user5948411

Si vous utilisez liquibase pour mettre à jour votre serveur SQL, vous essayez probablement d'insérer une clé d'enregistrement dans un champ autoIncrement. En supprimant la colonne de l'insert, votre script devrait s'exécuter. 

<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

Il y a une référence OperationId dans votre requête qui ne devrait pas être là car elle est incrémentée

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

donc votre requête sera 

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)
3
Onkar_M18

Eh bien, j'ai résolu le problème assez facilement. Vérifiez que votre clé primaire porte le même nom que vos classes. La seule différence est que votre clé primaire est complétée par 'ID' la classe est nommée.

2
Salem BeeJay Kosemani

La meilleure solution consiste à utiliser l'annotation GeneratedValue(strategy = ...), c'est-à-dire.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;

elle dit que cette colonne est générée par la base de données à l'aide de la stratégie IDENTITY et que vous n'avez pas besoin de vous en occuper - la base de données le fera.

1
  1. Cela se produit lorsque vous avez une colonne (clé primaire) qui n'est pas définie sur Is Identity à true en SQL et que vous ne transmettez pas de valeur explicite lors de l'insertion. Cela prendra la première ligne, alors vous ne pourrez pas insérer la deuxième ligne, l'erreur apparaîtra. Cela peut être corrigé en ajoutant cette ligne de code [DatabaseGenerated(DatabaseGeneratedOption.Identity)] dans votre colonne PrimaryKey et en vous assurant qu'il est défini sur un type de données int . Si la colonne est la clé primaire et que la valeur IsIDentity est définie sur true dans SQL, cette ligne de code [DatabaseGenerated(DatabaseGeneratedOption.Identity)] n'est pas nécessaire.
  2. cela se produit également lorsque vous avez une colonne qui n'est pas la clé primaire, dans SQL défini sur Is Identity sur true et dans votre EF, vous n'avez pas ajouté cette ligne de code [DatabaseGenerated(DatabaseGeneratedOption.Identity)].

Et si vous utilisez Oracle SQL Developer pour vous connecter, n'oubliez pas d'ajouter / sqldev: stmt /

/ sqldev: stmt / set identity_insert TABLE sur;

0
Hao Deng

Je ne suis pas sûr de l'utilité de "Insérer un tableau", mais si vous essayez simplement d'insérer des valeurs, essayez:

Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);

J'ai eu le même message d'erreur, mais je pense que cela devrait fonctionner. L'ID doit s'incrémenter automatiquement tant qu'il s'agit d'une clé primaire.

0
Matthew