删除重复数据,防止删除所有数据
这是mysql删除重复数据,且保留两条数据的sql,但这条语句含有一个危险的问题,如果子查询到的数据为空,会将表test的数据全部删除。
sql
DELETE
FROM
test
WHERE
id NOT IN (
SELECT
id
FROM
(
SELECT
id
FROM
test
WHERE
id IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a
UNION
SELECT
id
FROM
( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b
)
) c
)
思路
设置一个条件,这条件必须满足子查询有数据。
解决
在删除语句后,增加子查询有数据的结果大于0。
sql代码
AND (
SELECT
count(*)
FROM
(
SELECT
id
FROM
test
WHERE
id IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a
UNION
SELECT
id
FROM
( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b
)
) c
) > 0;
完整代码
DELETE
FROM
test
WHERE
id NOT IN (
SELECT
id
FROM
(
SELECT
id
FROM
test
WHERE
id IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a
UNION
SELECT
id
FROM
( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b
)
) c
)
AND (
SELECT
count(*)
FROM
(
SELECT
id
FROM
test
WHERE
id IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a
UNION
SELECT
id
FROM
( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b
)
) c
) > 0;