2013-02-15 89 views
40

所以我知道在MySQL有可能在一個查詢中插入多行,像這樣:MySQL的刪除一個查詢條件多行唯一的每一行

INSERT INTO table (col1,col2) VALUES (1,2),(3,4),(5,6) 

我想以類似的方式來刪除多行。我知道這是可能的基礎上刪除的每一行完全相同的條件下多行,即

DELETE FROM table WHERE col1='4' and col2='5' 

DELETE FROM table WHERE col1 IN (1,2,3,4,5) 

但是,如果我想在一個查詢刪除多行,每行有一組獨特的條件?像這樣的東西將是我在找什麼:

DELETE FROM table WHERE (col1,col2) IN (1,2),(3,4),(5,6) 

有沒有人知道的方法來做到這一點?還是不可能?

回答

75

你是非常接近的,你可以使用這個:

DELETE FROM table WHERE (col1,col2) IN ((1,2),(3,4),(5,6)) 

請參閱本fiddle

+1

@amitkate,爲什麼不呢? – Pacerier 2015-04-09 14:09:20

+4

請注意,在MySQL 5.6中,由於元組比較最終會進行表掃描,因此執行效果不佳。您應該更喜歡「WHERE(COL1 = 1 AND COL2 = 2)OR(COL1 = 3 AND COL2 = 4)...」以獲得更好的性能。這固定在5.7。 – ep4169 2016-03-11 17:26:48

+0

如果有人很好奇,這是在@ ep4169引用的5.7.3中修復的錯誤:https://bugs.mysql.com/bug.php?id=31188 – Kip 2017-02-09 20:26:49

8

給出的答案略有擴展,所以希望對提問者和其他任何人都有用。

您還可以SELECT您要刪除的值。但要注意錯誤1093 - 您無法在FROM子句中指定更新的目標表。

DELETE FROM 
    orders_products_history 
WHERE 
    (branchID, action) IN (
    SELECT 
     branchID, 
     action 
    FROM 
     (
     SELECT 
      branchID, 
      action 
     FROM 
      orders_products_history 
     GROUP BY 
      branchID, 
      action 
     HAVING 
      COUNT(*) > 10000 
     ) a 
    ); 

我想刪除單個操作/分支的歷史記錄數超過10,000的所有歷史記錄。感謝這個問題和選擇的答案,我可以。

希望這是有用的。

Richard。

+1

͏+ 1,但是您的格式化方式SQL是...... – Pacerier 2015-04-09 14:12:27

+0

格式化是提供層次結構和依賴關係。當然,1行SQL將是相同的但不可讀的。幾乎所有東西都比1班輪更好。當然,我使用Whitesmith代碼,沒有人喜歡這一點。 「太空白」我聽到他們發牢騷。呸!我說。使用IDE格式化您的偏好進行編輯和保存時回購的首選項。哦...你用vi ... ! :-) – 2015-09-21 11:31:36

+0

「Whitesmith」是什麼意思? – Pacerier 2015-09-22 01:39:11