如何从mysql表中删除重复的文本记录

时间:2017-09-17 18:26:06

标签: mysql database

我的mysql表words中有两列,这些列的名称是wordid,它是主键,其他列是lemma

我需要从表中删除lemma的重复值。请告诉我如何使用MySQL命令执行此操作。这是我的桌子样本。

wordid    ||  lemma

+--------+--------------------+

 148206  || wilful disobedience 

 149162  || wilful disobedience 

 149857 || wilful disobedience 

4 个答案:

答案 0 :(得分:1)

最简单的方法是在lemma列上添加UNIQUE索引。将IGNORE包含在ALTER语句中,以便删除所有重复项。请注意,下一个带有重复项的插入将引发错误。

ALTER IGNORE TABLE words
ADD UNIQUE INDEX idx_lemma (lemma);

答案 1 :(得分:1)

您可以使用以下查询一次执行此操作:

delete * from table_name where wordid not in (select wordid from table_name group by lemma)

内部查询将为每个引理选择第一个wordid并忽略重复。 外部查询将从内部查询的结果中删除所有没有字id的行。它将删除所有其他具有重复引理的行。

答案 2 :(得分:0)

您可以使用内部联接删除子选择表单获取wordid不删除

  delete from  my_table a
  inner join  (
    select wordid
    from my_table
    group by lemma
    having count(*) >1 
  )  t  on a.wordid = t.word.id 
  where wordid not in (  select wordid_to_delete
    from (
          select min(wordid) as wordid_to_delete
          from my_table 
          group by lemma
          having count(*)>1
     ) t2

  )

答案 3 :(得分:0)

第一步是确定哪些行具有重复的主键值:

      SELECT col1, col2, count(*)
       FROM t1
      GROUP BY col1, col2
       HAVING count(*) > 1

这将为表中的每组重复PK值返回一行。此结果中的最后一列是特定PK值的重复数。

如果只有几组重复的PK值,最好的方法是逐个手动删除它们。例如:

    set rowcount 1
     delete from t1
      where col1=1 and col2=1

rowcount值应为n-1给定键值的重复数。

如果表中有许多不同的重复PK值集,则单独删除它们可能会非常耗时。在这种情况下,可以使用以下过程:

- 首先,运行上面的GROUP BY查询以确定存在多少组重复PK值,以及每组的重复计数。

- 在保留表中选择重复的键值。例如:

     SELECT col1, col2, col3=count(*)
        INTO holdkey
    FROM t1
     GROUP BY col1, col2
     HAVING count(*) > 1

- 在保留表中选择重复的行,从而消除过程中的重复行。例如:

      SELECT DISTINCT t1.*
    INTO holddups
     FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2

此时,holddups表应具有唯一的PK,但是,如果t1具有重复的PK,则不会出现这种情况。例如,

从原始表中删除重复的行。例如:

     DELETE t1
     FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2

将唯一的行放回原始表格中。例如:

     INSERT t1 SELECT * FROM holddups

希望这有帮助!