2017-09-17 61 views
0

我在我的mysql表words中有两列,这些列的名称是wordid,它是主键,其他列是lemma如何删除mysql表中的重复文本记录

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

wordid || lemma 

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

148206 || wilful disobedience 

149162 || wilful disobedience 

149857 || wilful disobedience 

回答

1

做到这一点,最简单的方法是在lemma列添加一个唯一索引。将IGNORE纳入ALTER声明中,因此所有重复项都将被删除。请注意,下一次插入重复项会引发错误。

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

它给出了语法错误。 – Nisa

+0

@Nisa,看看这个小提琴:http://sqlfiddle.com/#!9/f4cef0/1。一切正常,也许你一步一步提供完整的查询来重现错误?或者更好的小提琴 –

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 

) 
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 

希望这有助于!

1

您可以通过下面的查询做一次中:

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

内查询将选择每个引理第一的wordID并忽略重复。 外部查询将从内部查询的结果中删除所有没有单词标识的行。它会删除所有其他具有重复引理的行。