使用WITH和Partition在MySQL中删除重复行时遇语法错误求助
解决MariaDB删除重复行的语法错误问题
你的代码报错是因为MariaDB(尤其是旧版本)不支持直接对CTE(公共表表达式)执行DELETE操作——CTE只是临时结果集,不能直接作为删除目标。以下是两种可行的修正方案:
方案一:使用关联子查询删除
这种方法兼容大多数MariaDB版本,需要借助表的唯一标识列(比如主键)来精准定位要删除的重复行:
DELETE s1 FROM student_quiz s1 JOIN ( SELECT *, ROW_NUMBER() OVER(PARTITION BY studentID ORDER BY studentID) AS RowNumber FROM student_quiz ) s2 ON s1.studentID = s2.studentID AND s1.your_primary_key = s2.your_primary_key -- 替换成你表的主键/唯一标识列 WHERE s2.RowNumber > 1;
方案二:CTE关联原表删除(MariaDB 10.3+)
如果你的MariaDB版本是10.3及以上,可以保留CTE写法,但需要关联原表而非直接删除CTE:
WITH studentTable AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY studentID ORDER BY studentID) AS RowNumber FROM student_quiz ) DELETE s FROM student_quiz s JOIN studentTable st ON s.your_primary_key = st.your_primary_key -- 替换成唯一标识列 WHERE st.RowNumber > 1;
注意事项
- 必须替换代码中的
your_primary_key为表中实际的主键或唯一列(比如id、quiz_record_id),否则可能误删所有重复组的行。 - 执行删除前,建议先把
DELETE换成SELECT s1.*(方案一)或SELECT s.*(方案二),确认将要删除的行符合预期后再执行删除。 - 如果表没有唯一标识列,建议先添加自增主键,避免删除时出现匹配错误。
内容的提问来源于stack exchange,提问作者tester tested
相关产品推荐
相关产品推荐

