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

标签 c++ sql-server odbc

我正在编写一个 ODBC 类来连接到远程 SQL Server 数据库。我大部分时间都在工作。

该类能够生成如下查询:

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() 返回的消息。

最佳答案

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

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

关于c++ - 从 UPDATE 查询中获取 'Cannot insert duplicate key',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912455/

相关文章:

c++ - 如何使用 OpenCV 从网络摄像头获取孔径角?

sql-server - 从Grails访问SQL Server 2008 View

sql-server - 使用 SQL Server 在 Access 中写入冲突

mysql - 从特定日期选择唯一记录,不包括以前日期的重复记录

c++ - 是否有必要使用 'new' 分配一个新指针,指向一个与先前存在的指向同一结构的指针相同的结构?如果是这样,为什么?

c++ - 使用Boost zip_iterator将两个 vector 写入CSV文件

c++ - 快速生成随机集,蒙特卡洛模拟

c# - 在 .NET 中使用带有 ODBC 连接的查询参数到 iSeries AS400 数据库?

php - “PDOException”消息“SQLSTATE[22001] : String data, 右截断:0

mysql - Delphi - 将 DateTime Null 保存到 DB (ADO/MySQL)