MySQL的删除一个查询条件多行唯一的每一行

问题描述:

所以我知道在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) 

有没有人知道的方法来做到这一点?还是不可能?

你是非常接近的,你可以使用这个:

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

给出的答案略有扩展,所以希望对提问者和其他任何人都有用。

您还可以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