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


69

因此,我知道在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)

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

Answers:


116

您非常亲密,可以使用以下命令:

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

请看这个小提琴


9
请注意,在MySQL 5.6中,由于元组比较最终会进行表扫描,因此这将导致性能下降。为了获得更好的性能,您应该选择“ WHERE(col1 = 1 AND col2 = 2)OR(col1 = 3 AND col2 = 4)...”。5.7中已修复此问题。
ep4169 '16

如果有人好奇,这是@ ep4169在5.7.3中修复的错误:bugs.mysql.com/bug.php?id=31188
Kip

12

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

您还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。多亏了这个问题和选择的答案,我可以。

希望这是有用的。

理查德


1
格式化是为了提供层次结构和依赖性。当然,SQL的1行将是相同的,但不可读。几乎所有东西都比1衬管更好。当然,我将Whitesmith用作我的代码,也没人喜欢。“太多的空白”我听到他们在抱怨。ah!我说。使用可对其进行格式化的IDE,以根据您的喜好进行编辑,并在保存时根据存储库的喜好进行格式化。哦...您使用vi ... <叹>!:-)
理查德·A夸脱2015年

“白铁匠”是什么意思?
和平者


哇,真奇怪。我完全不记得有人在使用它...你几岁?
Pacerier's

2
将近50。想到它的方法是,如果您使用BASIC,Pascal,COBOL,则BEGIN / END将始终在单独的行上并缩进。当我想{}时,我只是遵循了那个。由于{}在复合语句周围,因此它们从属于if()/ while()/ etc。所以缩进。这是合乎逻辑的选择,但并不十分流行。
理查德·阿夸德

-1

进行了大量谷歌搜索,但是当我想使用值列表从单个表中删除多个项目时,这就是我在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)

该问题询问如何在不使用Python的MySQL中进行操作。
普拉纳夫·霍桑加迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.