0
votes

Obtention de "Impossible d'insérer la clé en double" à partir de la requête UPDATE

J'écris une classe ODBC pour me connecter à une base de données SQL Server distante. J'ai presque tout fonctionné.

La classe a la capacité de générer des requêtes telles que les suivantes:

UPDATE Clients SET Id = ?, Name = ?, TaxId = ?, ContactFName = ?, ContactLName = ?, Phone_Office = ?, Phone_Mobile = ?, Phone_Home = ?, Email = ?, Website = ?, Address1_Physical = ?, Address2_Physical = ?, City_Physical = ?, State_Physical = ?, Zip_Physical = ?, Address1_Billing = ?, Address2_Billing = ?, City_Billing = ?, State_Billing = ?, Zip_Billing = ?, StartingBalance = ?, Discount = ?, BillingSequence = ?, BillingCategory = ?, ?, ShowOnReport = ?, Active = ?, CreateDate =?

Comme vous pouvez le voir, il s'agit d'une requête UPDATE. Pourtant, l'exécution de cette requête me donne une erreur:

Pilote Microsoft ODBC 17 pour SQL Server (SQL Server): ReturnCode: -1: Violation de la contrainte PRIMARY KEY 'PK_Customers'. Impossible d'insérer la clé en double dans l'objet 'dbo.Customers'. La valeur de clé en double est (82). (État: 23000, NativeError: 2627): l'instruction a été interrompue. (État: 01000, NativeError: 3621)

Je ne comprends pas pourquoi j'obtiens une erreur d'insertion lorsque je fais une mise à jour. Quelqu'un a-t-il vu ça?

Remarques:

  • Id est la clé primaire. Je lis d'abord toutes les valeurs de colonne de la base de données, puis je mets à jour celles que je souhaite modifier. L'identifiant ne change pas.
  • L'erreur ci-dessus a été mise en place par mon code, mais est basée sur les messages renvoyés par SQLGetDiagRec().

0 commentaires

3 Réponses :


0
votes

Dans la MISE À JOUR, je vois un champ appelé ID. Si vous apportez une modification à l'ID et qu'il s'agit de la clé primaire, alors le SGBD fera des tracas parce que vous essayez de stocker des clés en double.


1 commentaires

Si l'ID ne change pas, je suggère de le retirer de la mise à jour et de voir quel message vous recevez.



9
votes

Il n'y a pas de clause WHERE dans l'instruction UPDATE, donc il essaie de mettre à jour CHAQUE RANGÉE dans la base de données, et comme ID est l'une des colonnes en cours de modification, il essaie de définir l'ID de chaque ligne sur la même valeur. Cela entraîne une tentative de création d'une clé primaire en double.

Assurez-vous que votre instruction UPDATE a une clause WHERE appropriée ... comme "WHERE ID =?" ... et il est probablement préférable de NE PAS inclure l'ID dans cette instruction UPDATE si elle ne change pas.


1 commentaires

Oh! Je suis tellement loin dans les détails techniques, cela m'a manqué.



1
votes

C'est le message auquel vous devez vous attendre lorsqu'une instruction UPDATE viole une clé primaire. EG

use tempdb
go
drop table if exists t

create table t(id int primary key)

insert into t(id) values (1),(2)

go

update t set id = 2 where id = 1
--Msg 2627, Level 14, State 1, Line 11
--Violation of PRIMARY KEY constraint 'PK__t__3213E83F127C5D76'. Cannot insert duplicate key in object 'dbo.t'. The duplicate key value is (2).
--The statement has been terminated.


0 commentaires