【问题标题】:MySQL delete multiple rows in one query conditions unique to each rowMySQL在一个查询中删除多行,每行唯一的条件
【发布时间】:2013-01-31 23:32:30
【问题描述】:

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

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

【问题讨论】:

    标签: mysql unique-constraint multiple-records


    【解决方案1】:

    你很亲密,你可以用这个:

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

    请看这个fiddle

    【讨论】:

    • 请注意,在 MySQL 5.6 中,这将表现不佳,因为元组比较最终会进行表扫描。您应该更喜欢“WHERE (col1=1 AND col2=2) OR (col1=3 AND col2=4)...”以获得更好的性能。这在 5.7 中已修复。
    • 如果有人好奇,这是 @ep4169 引用的 5.7.3 中修复的错误:bugs.mysql.com/bug.php?id=31188
    【解决方案2】:

    对给出的答案进行了轻微扩展,因此希望对提问者和其他任何人有用。

    您也可以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 班轮好。当然,我使用 Whitesmith 作为我的代码,也没有人喜欢它。 “太多的空白空间”我听到他们抱怨。呸!我说。使用 IDE 将其格式化为您的编辑偏好和保存时存储库的偏好。哦……你用 vi……! :-)
    • 你所说的“怀特史密斯”是什么意思?
    • Whitesmith 是代码格式化样式en.wikipedia.org/wiki/Indent_style#Whitesmiths_style
    • 哇,这很奇怪。我完全不记得有人用过它……你几岁?
    • 将近 50 个。考虑它的方式是,如果您使用 BASIC、Pascal、COBOL,那么 BEGIN/END 将始终位于不同的行并缩进。当我想{}时,我只是跟着它。由于 {} 在复合语句周围,它们从属于 if()/while()/etc。缩进也是如此。这是一个合乎逻辑的选择,但不是很受欢迎。
    【解决方案3】:

    花了很多谷歌搜索,但当我想使用值列表从单个表中删除多个项目时,这是我在 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中做到这一点。
    猜你喜欢
    • 2010-10-10
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2023-03-05
    相关资源
    最近更新 更多