You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:35:11