从 UPDATE 查询中获取 'Cannot insert duplicate key'

Getting 'Cannot insert duplicate key' from UPDATE query

我正在编写 ODBC class 以连接到远程 SQL 服务器数据库。我大部分都在工作。

class 能够生成如下查询:

UPDATE Customers 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=?

如您所见,这是一个 UPDATE 查询。然而,运行 这个查询给了我一个错误:

Microsoft ODBC Driver 17 for SQL Server (SQL Server) : ReturnCode: -1 : Violation of PRIMARY KEY constraint 'PK_Customers'. Cannot insert duplicate key in object 'dbo.Customers'. The duplicate key value is (82). (State: 23000, NativeError: 2627) : The statement has been terminated. (State: 01000, NativeError: 3621)

我很困惑为什么我在进行更新时收到有关插入的错误。有人看过吗?

备注:

在更新中,我看到一个名为 ID 的字段。如果您正在更改 ID 并且它是主键,那么 DBMS 将会大惊小怪,因为您正在尝试存储重复的键。

UPDATE 语句中没有 WHERE 子句,因此它试图更新数据库中的每一行,并且由于 ID 是正在更改的列之一,它试图将每一行的 ID 设置为相同的值。这导致尝试创建重复的主键。

确保您的 UPDATE 语句具有适当的 WHERE 子句...例如 "WHERE ID = ?"...如果 ID 没有更改,最好不要在该 UPDATE 语句中包含 ID。

这是当 UPDATE 语句违反主键时您应该期望的消息。 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.