由于密钥冲突 VBA SQL 访问,更新失败

Posted

技术标签:

【中文标题】由于密钥冲突 VBA SQL 访问,更新失败【英文标题】:UPDATE failed due to key violation VBA SQL Access 【发布时间】:2014-01-28 11:35:05 【问题描述】:

我需要这方面的帮助

我有一个 MS Access db 表单,它允许用户编辑有关项目的详细信息,当单击保存按钮时,输入的新值将保存到 db 表中我正在使用 sql UPDATE 语法来执行此操作和我的代码类似于下面

Private Sub Save_Click()

ltemp = " UPDATE Table1 "
ltemp = ltemp & " SET ClientName  = 'ANN' "
ltemp = ltemp & " WHERE ProjectID = 2333 "
CurrentDb.Execute (ltemp)

End Sub 

使用这段代码,什么都没有发生。代码执行时不会出错,但表中的值不会改变。 我试了代码

DoCmd.RunSQL " UPDATE Table1 SET ClientName = 'ANN'  WHERE ProjectID = 2333"

我收到一条很长的错误消息,表明由于密钥违规而无法更新记录。问题是“ClientName”字段不是主键,尽管它(在关系中)链接到另一个表的主键。

这两个代码都可以更新其他字段,除了这个与另一个表的主键有关系的字段。

【问题讨论】:

【参考方案1】:

显然,您的“客户”表中没有具有“ANN”ID 的记录,因此无法将其设置为更新表中相应\外键字段的有效值。

currentDb.execute 指令不会返回任何错误消息(不像“DoCommand”),因为它不应该返回,只要语法正确(见下文)。您可以尝试使用 currentDb.RecordsAffected 检查您的指令是否更改了任何记录。检查可用于执行方法的参数以获取更多详细信息。

访问帮助:

“在 Microsoft Jet 工作区中,如果您提供语法正确的 SQL 语句并拥有适当的权限,则 Execute 方法不会失败 — 即使不能修改或删除任何一行 . 因此,在使用 Execute 方法运行更新或删除查询时,请始终使用 dbFailOnError 选项。如果任何受影响的记录被锁定且无法更新或已删除。”

【讨论】:

【参考方案2】:

您正试图违反在您的数据库上设置的参照完整性。

正如您所指出的,还有另一个表格,看起来像这样:

CREATE TABLE Client
(
    ClientName VARCHAR(100),
    ... other client fields here
);

Table1.ClientNameClient.ClientName 列之间有一个FOREIGN KEY 设置。

为了避免这种情况,要么:

将名称为 ANN 的客户端插入到另一个表中 如果您打算违反约束,请删除 Table1.ClientName 上的外键约束(但请注意,当客户端丢失时,连接可能会失败) 更改设计并开始使用代理键,例如ClientID,并在您的其他表中引用代理键(而不是像客户端名称这样的“自然”键)。这样,客户可以结婚、改名等,并且您的数据库不会损坏:)

【讨论】:

谢谢...我将名称 ANN 添加到链接表中,就完成了。谢谢

以上是关于由于密钥冲突 VBA SQL 访问,更新失败的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA 和 SQL Server - 记录集更新时 ODBC 调用失败

vba 连接局域网SQL服务器失败

连接失败:SQLSTATE [42000]:语法错误或访问冲突:1064

由于 ssh 密钥,Git 推送失败:主机密钥验证失败。从码头工人内部

带有 SQL Server 后端更新的 MS Access 失败且没有错误

Excel VBA 查询访问失败