2009-06-25 39 views
1

來自非英語母語爲英語的上述問題的嘗試翻譯:我想要做的INSERT沒有記錄在數據庫

這是插入值時,當值大約最快的方法問題,使用到數據庫可能已經在數據庫中了。當值存在時,INSERT將失敗,否則UPDATE將失敗。哪一個選擇是最合適的?

  • 先做SELECT並選擇INSERT或UPDATE。
  • 先插入並使用UPDATE,如果它有重複的錯誤。

如果除了上述之外還有其他不錯的選擇,請教我。

環境使用MySQL 4.1。

+0

我非常肯定你能。 – scunliffe 2009-06-25 02:10:18

+0

如何在沒有此記錄的情況下插入記錄不在數據庫中? – freddiefujiwara 2009-06-25 02:11:55

+0

可以在插入前選擇嗎? – freddiefujiwara 2009-06-25 02:12:33

回答

11

如果你想這樣做,在一個單獨的語句是什麼(聽起來像你想要什麼),我會建議使用INSERT ... ON DUPLICATE KEY UPDATE語法,如下:

INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom') 
    ON DUPLICATE KEY UPDATE someothervalue = 'hi mom'; 

是否存在與指定的密鑰值(主鍵或唯一)沒有現有記錄中的初始INSERT語句將執行。如果記錄已經存在,則執行以下UPDATE語句(someothervalue = 3)。

這在所有版本的MySQL中都受支持。欲瞭解更多信息,請參閱MySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE

0

更新:之前,我得到了一堆更downvotes ...應該指出,這是第一個回覆,被編輯和理解問題之前)

老實說這聽起來像你。想知道如果記錄已經存在該怎麼辦?或者是新的?

所以你想要做的(僞代碼)

$count = SELECT COUNT FROM TABLE WHERE CONDITION; 

if($count == 1){ 
    UPDATE... 
} else { 
    INSERT... 
} 
-1

或者您可以使用IF EXISTS語法來檢查是否有行。

0

我會建立一個測試數據庫和一個腳本來對選項進行基準測試。

只是猜測它,我相信先執行INSERT並重試UPDATE是平均速度更快的方法。這是因爲如果數據不在數據庫中,那麼您保存了另一個查詢。如果您的數據更經常地在數據庫中,那麼先執行UPDATE,如果失敗,則使用INSERT重試。

但是,錯誤可能導致事務中止並需要回滾。如果這對你不好,那麼你需要先做一個SELECT。

我不瞭解MySQL,但我知道在哪裏工作,我們在PostgreSQL數據庫上使用存儲過程來執行此操作。存儲過程執行SELECT,然後執行INSERT或UPDATE。

0

在PHP中,我會首先執行UPDATE,然後使用mysql_affected_rows()檢查行是否更新。如果沒有,那麼我會做一個INSERT。請注意,必須更改mysql_affected_rows()行以返回大於1的結果。

相關問題