亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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,這樣你就不會嘗試追加已經存在的值 - 即,防止錯誤發生在第一個放置而不是依靠數據庫引擎來拯救你?!?/em>


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 664 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號