MySQL delete multiple rows in one query conditions unique to each row

MysqlUnique ConstraintMultiple Records

Mysql Problem Overview


So I know in http://www.mysql.com/">MySQL</a> it's possible to insert multiple rows in one query like so:

INSERT INTO table (col1,col2) VALUES (1,2),(3,4),(5,6)

I would like to delete multiple rows in a similar way. I know it's possible to delete multiple rows based on the exact same conditions for each row, i.e.

DELETE FROM table WHERE col1='4' and col2='5'

or

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

However, what if I wanted to delete multiple rows in one query, with each row having a set of conditions unique to itself? Something like this would be what I am looking for:

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

Does anyone know of a way to do this? Or is it not possible?

Mysql Solutions


Solution 1 - Mysql

You were very close, you can use this:

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

Please see this fiddle.

Solution 2 - Mysql

A slight extension to the answer given, so, hopefully useful to the asker and anyone else looking.

You can also SELECT the values you want to delete. But watch out for the Error 1093 - You can't specify the target table for update in FROM clause.

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
	);

I wanted to delete all history records where the number of history records for a single action/branch exceed 10,000. And thanks to this question and chosen answer, I can.

Hope this is of use.

Richard.

Solution 3 - Mysql

Took a lot of googling but here is what I do in Python for MySql when I want to delete multiple items from a single table using a list of values.

#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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsrchuloView Question on Stackoverflow
Solution 1 - MysqlfthiellaView Answer on Stackoverflow
Solution 2 - MysqlRichard A QuadlingView Answer on Stackoverflow
Solution 3 - MysqlTom KrierView Answer on Stackoverflow