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.
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
ne mettez pas de valeur dans OperationID car il sera généré automatiquement. essaye ça:
Insert table(OpDescription,FilterID) values ('Hierachy Update',1)
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é?
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.
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; }
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
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
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>
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)
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.
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.
[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.[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;
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.