为了账号安全,请及时绑定邮箱和手机立即绑定

在MS访问中进行升级

在MS访问中进行升级

繁星coding 2019-07-25 10:08:31
在MS访问中进行升级我需要为MS-Access 2000编写一个SQL查询,以便在存在时更新一行,如果不存在则插入。(我相信这被称为“upsert”)即如果行存在...UPDATE Table1 SET (...) WHERE Column1='SomeValue'如果它不存在......INSERT INTO Table1 VALUES (...)这可以在一个查询中完成吗?
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我通常首先运行insert语句然后检查是否发生了错误3022,这表明该行已经存在。所以像这样:

On Error Resume Next
CurrentDb.Execute "INSERT INTO Table1 (Fields) VALUES (Data)", dbFailOnErrorIf Err.Number = 3022 Then
    Err.Clear        
    CurrentDb.Execute "UPDATE Table1 SET (Fields = Values) WHERE Column1 = 'SomeValue'", dbFailOnError
ElseIf Err.Number <> 0 Then
    'Handle the error here
    Err.ClearEnd If

编辑1:
我想提一下,我在这里发布的是一个非常常见的解决方案但你应该意识到,计划错误并将它们作为程序正常流程的一部分通常被认为是一个坏主意,特别是如果有的话其他方法可以达到相同的效果。感谢RolandTumble指出这一点。


查看完整回答
反对 回复 2019-07-25
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

假设Column1上有唯一索引,您可以使用DCount表达式来确定您是否有零行或一行,其中Column1 ='SomeValue'。然后INSERTUPDATE基于该计数。

If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then
    Debug.Print "do INSERT"Else
    Debug.Print "do UPDATE"End If

我更喜欢这种方法,首先尝试INSERT捕获3022密钥违规错误,然后执行UPDATE响应错误。但是我无法从我的方法中获得巨大的利益。如果您的表包含自动编号字段,则避免失败INSERT将阻止您不必要地消耗下一个自动编号值。我还可以避免INSERT在不需要时构建字符串。Access Cookbook告诉我字符串连接在VBA中是一个中等昂贵的操作,所以我寻找机会避免构建字符串,除非实际需要它们。这种方法也可以避免为不需要的人创建一个锁INSERT

但是,这些原因中没有一个对您来说非常有吸引力。老实说,我认为我在这种情况下的偏好可能与我的“感觉正确”有关。我同意@ David-W-Fenton前一个Stack Overflow问题的评论“最好编写你的SQL,这样你就不会尝试追加已经存在的值 - 即,防止错误发生在第一个放置而不是依靠数据库引擎来拯救你。“


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 636 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信