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

Postgres 16.8中CTE插入后更新同条记录失败求助

问题解决:Postgres中插入后更新字段未生效

问题根源

你的语句失效核心原因是字段名time是Postgres的保留关键字,未加双引号引用时会被解析为内置函数/类型,导致字段引用歧义;此外拆分插入和更新操作也增加了不必要的复杂度。

解决方案

方案1:修改字段名(推荐)

避免使用保留关键字作为字段名,将time改为create_time或其他非关键字名称,一步完成插入并计算目标字段:

-- 重建表(已有数据需先迁移)
CREATE TABLE wf_policy
(
    id          BIGSERIAL PRIMARY KEY, 
    name        TEXT   NOT NULL,       
    create_time BIGINT,       
    ver         BIGINT       
);

-- 插入时直接计算ver值
WITH new_id AS (
    SELECT nextval('wf_policy_id_seq') AS id
)
INSERT INTO wf_policy (id, name, create_time, ver)
SELECT id, 'Name', 1000000, id + 1000000
FROM new_id
RETURNING *;

方案2:保留原字段名,修正语句

若无法修改字段名,所有引用time字段的地方必须用双引号"time"包裹,修正后的CTE语句如下:

WITH inserted_row AS (
    INSERT INTO wf_policy (name, "time", ver)
    VALUES ('Name', 1000000, 0)
    RETURNING id, "time"
)
UPDATE wf_policy
SET ver = inserted_row."time" + inserted_row.id
FROM inserted_row
WHERE wf_policy.id = inserted_row.id
RETURNING wf_policy.id, wf_policy.name, wf_policy."time", wf_policy.ver;

执行后ver字段会正确设置为id + time的值。

内容的提问来源于stack exchange,提问作者voidMainReturn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:38:17