518 votes

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. De quoi s'agit-il, et comment peut-il être résolu?

Insert into table(OperationID,OpDescription,FilterID)
values (20,'Mise à jour de la hiérarchie',1)

Erreur:

Serveur: Msg 544, Niveau 16, État 1, Ligne 1

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

664voto

pjp Points 7012

Vous insérez des valeurs pour OperationId qui est une colonne d'identité.

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

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/*Remarquez que la liste des colonnes est OBLIGATOIRE ici, et non optionnelle*/
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Mise à jour de la hiérarchie',
             1)

SET IDENTITY_INSERT Table1 OFF

22 votes

+1 exactement - activer l'option pour permettre les insertions explicites ON, puis insérer, puis désactiver à nouveau l'option OFF

19 votes

Si vous voulez vraiment ajouter votre valeur à la colonne d'identité, c'est votre réponse, mais d'un autre côté, quelqu'un a configuré la colonne pour s'incrémenter automatiquement lors de l'insertion. Dans ce cas, la table suivra le prochain numéro disponible, et vous n'avez pas besoin de générer l'OperationID par vous-même. Le nouvel identifiant peut être récupéré en utilisant SELECT SCOPE_IDENTITY().

10 votes

Bonne réponse, mais assurez-vous de savoir ce que vous faites. Pour moi, il est utile de semer une base de données avec des données où les clés étrangères doivent correspondre sur différentes tables

93voto

Wael Dalloul Points 7995

Ne mettez pas de valeur à OperationID car elle sera générée automatiquement. essayez ceci :

Insert table(OpDescription,FilterID) values ('Mise à jour de la hiérarchie',1)

8 votes

Ceci est la réponse correcte si vous voulez un OperationID généré automatiquement

46voto

HLGEM Points 54641

Soyez très méfiant de définir IDENTITY_INSERT sur ON. C'est une pratique risquée sauf si la base de données est en mode maintenance et définie sur un seul utilisateur. Cela affecte non seulement votre insertion, mais également celle de toute personne essayant d'accéder à la table.

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

5 votes

Affecte de quelle manière? Il s'agit d'une option au niveau de la session et non d'une propriété de la table.

5 votes

Une synchronisation unique des données entre deux bases de données que vous souhaitez maintenir les relations. Par exemple, je l'ai utilisé pour extraire le schéma de mes produits d'une base de données à une autre.

1 votes

@NSjonas, ce serait une bonne utilisation de l'option SET IDENTITY_INSERT table1 ON. J'ai vu des gens qui voulaient l'utiliser pour faire quelque chose depuis l'application qui devrait être fait avec une simple insertion et en permettant à l'identité d'être générée.

8voto

iowatiger08 Points 480

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

    

  

 ...

0voto

Hao Deng Points 129

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

/sqldev:stmt/ set identity_insert TABLE on;

0 votes

Clairement, ce n'est pas le cas, la question a une balise "sql-server"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X