PostgreSQL删除重复记录报错:语法错误位于'e',请求技术支持
解决PostgreSQL中删除重复记录的语法错误问题
你遇到的问题是PostgreSQL不支持你使用的MySQL风格DELETE语法,DELETE e FROM (...) e这种写法不符合PostgreSQL的语法规范,所以才会抛出syntax error at or near "e"的错误。
下面给你两种PostgreSQL原生支持的可行解决方案:
方法1:使用CTE(公共表表达式)删除重复记录
CTE是PostgreSQL里实用的特性,先通过它标记出重复的记录,再关联原表执行删除:
WITH duplicate_records AS ( SELECT ctid, -- PostgreSQL系统行标识符,用于唯一标记每行 ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY emp_id) AS rn FROM employee1 ) DELETE FROM employee1 USING duplicate_records WHERE employee1.ctid = duplicate_records.ctid AND duplicate_records.rn > 1;
方法2:使用子查询结合系统标识符删除
这种方式直接通过子查询筛选出要删除行的ctid,再执行删除操作:
DELETE FROM employee1 WHERE ctid IN ( SELECT ctid FROM ( SELECT ctid, ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY emp_id) AS rn FROM employee1 ) sub_query WHERE rn > 1 );
关键提示:
在执行删除前务必先验证要删除的记录,避免误删数据!你可以把DELETE语句替换为SELECT,先查看待删除的内容:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY emp_id) AS rn FROM employee1 ) sub WHERE rn > 1;
如果你的表有主键(比如id列),建议把ctid替换为主键列,这样会更稳妥——因为ctid在数据库执行vacuum操作后可能会发生变化。
内容的提问来源于stack exchange,提问作者Azman Amir
相关产品推荐
相关产品推荐

