2009-09-29 40 views
4

在MySQL中,我試圖找到一種有效的方式來執行一個UPDATE,如果一行中已經存在一個表或INSERT如果行不'不存在。執行更新或插入取決於MySQL中是否存在行

我發現了兩種可能的方式至今:

  1. 最明顯的一個:打開一個交易,SELECT找到,如果行存在,INSERT,如果它不存在或UPDATE如果存在的話,犯交易
  2. 第一INSERT IGNORE到表(因此,如果該行已經存在升高沒有錯誤),然後更新

第二種方法避免了該事務。

哪一個你認爲更有效率,並有更好的方法(例如使用觸發器)?

+2

我曾經聽說過這被稱爲Upserting。我發現它是一個很好的簡潔的術語。由於某種原因,它使我咯咯地笑。 – 2009-09-29 14:12:37

+0

@MikeTwo也讓我咯咯笑起來,可能'因爲它聽起來像掀裙:) – nawfal 2012-04-02 08:48:16

回答

11
+0

如果任何一個字段匹配或只有鍵/唯一字段,是否更新更新密鑰更新? – user97410 2009-09-29 14:14:27

+0

僅當匹配唯一/主鍵索引中的條目時才被激活。 – 2009-09-29 15:21:33

+0

真的很棒 – user97410 2009-09-29 20:53:25

3

您也可以執行UPDATE,檢查受影響的行數,如果它小於1,那麼它沒有找到匹配的行,因此執行INSERT。

2

mysql有一個REPLACE聲明的是,我相信,確實或多或少你想要它做的事情。

1

如果你做了很多的這些,它可能是值得他們寫入到文件,然後使用「LOAD DATA INFILE ... REPLACE ...

3

還有另一種方式 - REPLACE

REPLACE INTO myTable (col1) VALUES (value1) 

更換作品酷似INSERT,不同之處在於,如果一個老行的表具有相同的值作爲一個主鍵或唯一索引的新行,舊行的新行之前刪除被插入。 See Section 12.2.5, 「INSERT Syntax」

2

REPLACE INTO將是一個解決方案,它使用UNIQUE INDEX替換或插入的東西。

REPLACE INTO 
    yourTable 
SET 
    column = value; 

請注意,這個作品不同於你所期望的是什麼,該REPLACE是毫不誇張。它首先檢查是否存在會阻止INSERT的碰撞,它會刪除(DELETE)所有碰撞的行,然後刪除所給的行。例如,這會導致觸發器不會觸發的細微問題(因爲它們會檢查更新,這種情況永遠不會發生),或者將值恢復爲默認值(因爲您必須指定所有值)。

相關問題