我的mysql表words
中有两列,这些列的名称是wordid
,它是主键,其他列是lemma
。
我需要从表中删除lemma
的重复值。请告诉我如何使用MySQL命令执行此操作。这是我的桌子样本。
wordid || lemma
+--------+--------------------+
148206 || wilful disobedience
149162 || wilful disobedience
149857 || wilful disobedience
答案 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
希望这有帮助!