在MS访问中进行升级

在MS访问中进行升级

我需要为MS-Access 2000编写一个SQL查询,以便在存在时更新一行,如果不存在则插入。(我相信这被称为“upsert”)

如果行存在...

UPDATE Table1 SET (...) WHERE Column1='SomeValue'

如果它不存在......

INSERT INTO Table1 VALUES (...)

这可以在一个查询中完成吗?


繁星coding
浏览 637回答 3
3回答

慕勒3428872

我通常首先运行insert语句然后检查是否发生了错误3022,这表明该行已经存在。所以像这样:On&nbsp;Error&nbsp;Resume&nbsp;Next CurrentDb.Execute&nbsp;"INSERT&nbsp;INTO&nbsp;Table1&nbsp;(Fields)&nbsp;VALUES&nbsp;(Data)",&nbsp;dbFailOnErrorIf&nbsp;Err.Number&nbsp;=&nbsp;3022&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;Err.Clear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;CurrentDb.Execute&nbsp;"UPDATE&nbsp;Table1&nbsp;SET&nbsp;(Fields&nbsp;=&nbsp;Values)&nbsp;WHERE&nbsp;Column1&nbsp;=&nbsp;'SomeValue'",&nbsp;dbFailOnError ElseIf&nbsp;Err.Number&nbsp;<>&nbsp;0&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;'Handle&nbsp;the&nbsp;error&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;Err.ClearEnd&nbsp;If编辑1:我想提一下,我在这里发布的是一个非常常见的解决方案但你应该意识到,计划错误并将它们作为程序正常流程的一部分通常被认为是一个坏主意,特别是如果有的话其他方法可以达到相同的效果。感谢RolandTumble指出这一点。

人到中年有点甜

假设Column1上有唯一索引,您可以使用DCount表达式来确定您是否有零行或一行,其中Column1 ='SomeValue'。然后INSERT或UPDATE基于该计数。If&nbsp;DCount("*",&nbsp;"Table1",&nbsp;"Column1&nbsp;=&nbsp;'SomeValue'")&nbsp;=&nbsp;0&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;Debug.Print&nbsp;"do&nbsp;INSERT"Else &nbsp;&nbsp;&nbsp;&nbsp;Debug.Print&nbsp;"do&nbsp;UPDATE"End&nbsp;If我更喜欢这种方法,首先尝试INSERT捕获3022密钥违规错误,然后执行UPDATE响应错误。但是我无法从我的方法中获得巨大的利益。如果您的表包含自动编号字段,则避免失败INSERT将阻止您不必要地消耗下一个自动编号值。我还可以避免INSERT在不需要时构建字符串。Access Cookbook告诉我字符串连接在VBA中是一个中等昂贵的操作,所以我寻找机会避免构建字符串,除非实际需要它们。这种方法也可以避免为不需要的人创建一个锁INSERT。但是,这些原因中没有一个对您来说非常有吸引力。老实说,我认为我在这种情况下的偏好可能与我的“感觉正确”有关。我同意@ David-W-Fenton对前一个Stack Overflow问题的评论:“最好编写你的SQL,这样你就不会尝试追加已经存在的值 - 即,防止错误发生在第一个放置而不是依靠数据库引擎来拯救你。“
打开App,查看更多内容
随时随地看视频慕课网APP