的第一步是识别哪些行具有重复的主键值:
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
希望这有助于!
它给出了语法错误。 – Nisa
@Nisa,看看这个小提琴:http://sqlfiddle.com/#!9/f4cef0/1。一切正常,也许你一步一步提供完整的查询来重现错误?或者更好的小提琴 –