Keeping rows
It's very simple to delete, say, 10 top rows in MySQL:
DELETE
FROM   t_deleter
ORDER BY
          id
LIMIT 10
What if we want to delete all rows except the first 10?
Well…
We can try this:
DELETE
FROM    t_deleter
WHERE   id NOT IN
        (
        SELECT  id
        FROM    t_deleter
        ORDER BY
                id
        LIMIT 10
        )
, which results in infamous:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Ok, so let's try a single-row subquery:
DELETE
FROM    t_deleter
WHERE   id <
        (
        SELECT  id
        FROM    t_deleter
        ORDER BY
                id
        LIMIT 10, 1
        )
[/sourcecode]
Again no success:
<code>You can't specify target table 't_deleter' for update in FROM clause</code>
So what shall we do?
Fortunately, <strong>MySQL</strong> does support <code>DELETE</code> over multiple tables in a <code>JOIN</code>, and even more fortunately, this works:
DELETE  d.*
FROM    t_deleter d
LEFT JOIN
        (
        SELECT  id
        FROM    t_deleter
        LIMIT   10
        ) q
ON      d.id = q.id
WHERE   q.id IS NULL
| 9990 rows affected by the last command, no resultset returned | 
SELECT * FROM t_deleter
| id | value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Value 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 2 | Value 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 3 | Value 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 4 | Value 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 5 | Value 5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 6 | Value 6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 7 | Value 7 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 8 | Value 8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 9 | Value 9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 10 | Value 10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 10 rows fetched in 0.0003s (0.0014s) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  Subscribe in a reader
This was very helpful, thanks!
Christoph Holtermann
20 May 21 at 17:18