删除mysql中的重复项(2个表)

时间:2012-11-20 13:18:26

标签: mysql

我有两个表(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;

现在,我想在两个表中删除这些条目。我该怎么办?

3 个答案:

答案 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 - >测试