2009-02-18 79 views
2

我想更新Mysql 5上的表值,但是如果該鍵不存在,請創建它。在MySQL中是否存在「UPDATE value IF IF NO ROT INSERT yyy」?

我發現做到這一點的方法是:

INSERT yyy ON DUPLICATE KEY UPDATE field; 

的問題是:上述格式比其他的方式來做到這一點效率較低(如插入只會發生一次,並更新將十分發生經常)?

例如:

$result = UPDATE field; 
if (num_rows_effected($result)==0) INSERT yyy 

另外:有沒有更好的辦法在MySQL中做到這一點:例如一種:

UPDATE value IF NO SUCH ROW INSERT yyy; 

更新:對於那些誰建議更換,這裏我的問題的一個擴展: 「謝謝!我需要增加一個已經在表中的計數器(如果存在的話)。如果沒有爲這個列創建一個值爲1的錶行。我怎樣才能使用這種格式進行更新REPLACE)?「

回答

2

是的,你可以使用「替換」語法:

REPLACE INTO table1 (key, col1, col2) values (1, 'val1','val2'); 

這是具體到MySQL的特徵,而不是在其他數據庫必然實現。

至於效率,我的猜測是直接更新會更快,因爲MySQL本質上捕獲重複鍵錯誤並相應地處理它。但是,除非您正在執行大量的插入/更新,否則性能影響相當小。

+0

謝謝! 我需要增加一個已經在表中的計數器(如果存在的話)。如果不爲此列創建值爲1的表格行。我該如何更新這種格式? – Nir 2009-02-18 15:32:11

0

看看REPLACE命令,它符合你的要求。

+0

謝謝! 我需要增加一個已經在表中的計數器(如果存在的話)。如果不爲此列創建值爲1的表格行。我該如何更新這種格式? – Nir 2009-02-18 15:32:48

2

還有一個REPLACE也。

INSERT ON DUPLICATE KEY UPDATE將火UPDATE觸發時,它會偶然發現重複鍵並不會違反有關UPDATE的情況下FK的。

REPLACE將火DELETEINSERT觸發器,並將違反FK的引用行是REPLACE'd。

如果您沒有任何觸發器或FK's,則使用INSERT ON DUPLICATE KEY UPDATE,這是最有效的。

你似乎在尋找這個查詢:

INSERT 
INTO table (key, counter) 
VALUES (@key, 1) 
ON DUPLICATE KEY UPDATE 
    counter = counter + 1 

,除非你已經運行查詢之前選擇的計數器的前值不能與REPLACE做到這一點。

P. S.REPLACE出現在MySQLON DUPLICATE KEY UPDATE之前和被保持僅出於兼容性。使用它不會提高性能。

相關問題