我有两个表(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;
现在,我想在两个表中删除这些条目。我该怎么办?
答案 0 :(得分:1)
正如ALTER TABLE
Syntax所述(强调补充):
IGNORE
是标准SQL的MySQL扩展。如果新表中的唯一键上有重复项,或者如果启用了严格模式时出现警告,它将控制ALTER TABLE
的工作方式。如果未指定IGNORE
,则复制将中止并在发生重复键错误时回滚。 如果指定了IGNORE
,则只对第一行使用唯一键上具有重复项的行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。
因此:
ALTER IGNORE TABLE id_test ADD UNIQUE (YD)
答案 1 :(得分:1)
此查询显示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)
答案 2 :(得分:0)
我认为你没有用户选择,因为如果数据大不可能。 您应该克隆一个相同结构的表。插入数据不重复。
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; 强>
在drop table test之后,重命名test_new - >测试