MySQL在一次查询中删除多行,每行的查询条件都是唯一的

MySQL在一次查询中删除多行,每行的查询条件都是唯一的,mysql,unique-constraint,multiple-records,Mysql,Unique Constraint,Multiple Records,因此,我知道在一个查询中可以插入多行,如下所示: 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,co

因此,我知道在一个查询中可以插入多行,如下所示:

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,col2) IN (1,2),(3,4),(5,6)

有人知道这样做的方法吗?还是不可能

您非常接近,您可以使用:

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

请看这个。

对给出的答案稍加扩展,因此,希望对提问者和其他寻找答案的人有用

您还可以选择要删除的值。但是请注意错误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
    );
我想删除单个操作/分支的历史记录数超过10000的所有历史记录。感谢这个问题和选择的答案,我可以

希望这是有用的


Richard。

花了很多时间在谷歌上搜索,但当我想使用值列表从一个表中删除多个项时,我在Python for MySql中就是这么做的

#create some empty list
values = []
#continue to append the values you want to delete to it
#BUT you must ensure instead of a string it's a single value tuple
values.append(([Your Variable],))
#Then once your array is loaded perform an execute many
cursor.executemany("DELETE FROM YourTable WHERE ID = %s", values)

格式化是为了提供层次结构和依赖关系。确保SQL的1行是相同的,但不可读。几乎任何东西都比一艘邮轮好。当然,我的代码使用Whitesmith,也没有人喜欢它。“太多空白”我听到他们抱怨。呸!我说。使用IDE对其进行格式化,使其符合您的编辑偏好,并在保存时符合回购协议的偏好。哦你使用vi…!:-)你说的“Whitesmith”是什么意思?Whitesmith是一种代码格式化风格哇,这很奇怪。我完全不记得有人用过它。。。你多大了?快50了。考虑它的方式是,如果使用BASIC、Pascal、COBOL,那么开始/结束将始终位于单独的行上并缩进。当我想{}的时候,我就这么做了。由于{}在复合语句中,它们从属于if()/while()/等,因此缩进。这是一个合乎逻辑的选择,但不是很流行。请注意,在MySQL 5.6中,这将执行得很差,因为元组比较最终会执行表扫描。您应该更喜欢“WHERE(col1=1和col2=2)或(col1=3和col2=4)…”以获得更好的性能。这在5.7中已经修复。如果有人好奇的话,这就是@ep4169引用的5.7.3中修复的bug:问题是在没有Python的情况下如何在MySQL中实现它。
#create some empty list
values = []
#continue to append the values you want to delete to it
#BUT you must ensure instead of a string it's a single value tuple
values.append(([Your Variable],))
#Then once your array is loaded perform an execute many
cursor.executemany("DELETE FROM YourTable WHERE ID = %s", values)