我有两个表 (id_test, test) ,每个表都有一个 ID 列,它是唯一的,并且两个表中具有相同 id 的两个条目是相同的。现在,我在其中一个表(id_test)中有另一列也应该是唯一的,所以我想根据另一列消除重复项,我们称之为 YD。
识别我使用的重复项
SELECT ID, YD AS x, COUNT(*) AS y
FROM id_test
GROUP BY x
HAVING y>1;
现在,我想删除两个表中的这些条目。我该怎么做?
我有两个表 (id_test, test) ,每个表都有一个 ID 列,它是唯一的,并且两个表中具有相同 id 的两个条目是相同的。现在,我在其中一个表(id_test)中有另一列也应该是唯一的,所以我想根据另一列消除重复项,我们称之为 YD。
识别我使用的重复项
SELECT ID, YD AS x, COUNT(*) AS y
FROM id_test
GROUP BY x
HAVING y>1;
现在,我想删除两个表中的这些条目。我该怎么做?
如ALTER TABLE
语法中所述(强调添加):
IGNORE
是标准 SQL 的 MySQL 扩展。ALTER TABLE
如果新表中的唯一键有重复项,或者在启用严格模式时出现警告,它会控制如何工作。如果IGNORE
未指定,则在发生重复键错误时中止并回滚副本。如果IGNORE
指定,则仅第一行用于在唯一键上具有重复项的行。其他冲突的行被删除。不正确的值将被截断为最接近的匹配可接受值。
所以:
ALTER IGNORE TABLE id_test ADD UNIQUE (YD)
此查询显示表ID
中每个YD
的第一个id_test
:
SELECT ID, YD
FROM id_test
GROUP BY YD
这些是您必须保留的行。以下查询返回您必须删除的 ID:
SELECT id_test.ID
FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
WHERE id_test_keep.ID IS NULL
现在我想我需要更多关于你的桌子的细节,但我认为你需要的是:
DELETE FROM test
WHERE
test.ID IN (
SELECT id_test.ID
FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
WHERE id_test_keep.ID IS NULL)
我认为您不要用户选择,因为如果数据很大,那是不可能的。您应该克隆一个具有相同结构的表。插入不重复的数据。
INSERT INTO test_new (ID, YD) SELECT t.ID, t.YD FROM test t LEFT JOIN test_id ti ON t.ID = ti.id WHERE ti.id IS NULL;
删除表测试后,重命名 test_new -> test。