从 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 不会改变。
- 以上错误由我的代码拼凑而成,但基于
SQLGetDiagRec()
. 返回的消息
在更新中,我看到一个名为 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.
我正在编写 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 不会改变。- 以上错误由我的代码拼凑而成,但基于
SQLGetDiagRec()
. 返回的消息
在更新中,我看到一个名为 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.