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

src*_*ulo 61 mysql unique-constraint multiple-records

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

INSERT INTO table (col1,col2) VALUES (1,2),(3,4),(5,6)
Run Code Online (Sandbox Code Playgroud)

我想以类似的方式删除多行.我知道可以根据每行完全相同的条件删除多行,即

DELETE FROM table WHERE col1='4' and col2='5'
Run Code Online (Sandbox Code Playgroud)

要么

DELETE FROM table WHERE col1 IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在一个查询中删除多行,每行都有一组独有的条件,该怎么办?这样的东西就是我要找的东西:

DELETE FROM table WHERE (col1,col2) IN (1,2),(3,4),(5,6)
Run Code Online (Sandbox Code Playgroud)

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

fth*_*lla 99

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

DELETE FROM table WHERE (col1,col2) IN ((1,2),(3,4),(5,6))
Run Code Online (Sandbox Code Playgroud)

请看这个小提琴.

  • 请注意,在MySQL 5.6中,这将表现不佳,因为元组比较最终进行表扫描.您应该更喜欢"WHERE(col1 = 1 AND col2 = 2)OR(col1 = 3 AND col2 = 4)......"以获得更好的性能.这在5.7中得到修复. (6认同)

Ric*_*ing 11

对答案的略微延伸,因此,希望对提问者和其他任何人都有用.

您还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
    );
Run Code Online (Sandbox Code Playgroud)

我想删除所有历史记录,其中单个操作/分支的历史记录数超过10,000.感谢这个问题和选择的答案,我可以.

希望这是有用的.

理查德.

  • 将近50。想到它的方式是,如果您使用BASIC,Pascal,COBOL,则BEGIN / END将始终在单独的行上并缩进。当我想{}时,我只是遵循了那个。由于{}围绕复合语句,它们从属于if()/ while()/ etc。所以缩进。这是合乎逻辑的选择,但并不是很受欢迎。 (2认同)