使用 wCTE 更新刚刚插入的值

Use a wCTE to UPDATE a just-INSERTed value

我有 2 tables - 用户、文档。使用 RETURN,我正在 returning user_id(插入时新生成)和 doc_id(插入时新生成)。

我需要在插入时根据 return 值更新 table 文档中的一列。

说,用户 table 有

user_id| user_name| user_address
1      | user1    | 1addressline1
2      | user2    | 2addressline1

文档table有

doc_id| doc_name| reference_id | user_id
1     | 1doc    |              | 1
2     | 2doc    |              | 2

我需要使用与以下值相同的值更新 reference_id 列 doc_id(return插入时编辑)

doc_id 和 user_id 是自动生成的。

With row1 as (
    insert into users(user_name,user_address) 
    values('user3','useraddress3')
   RETURNING user_id
),row2 as (
   insert into documents(doc_name,user_id) 
   SELECT '"+3doc+"',user_id from row1 RETURNING doc_id
) 
UPDATE documents 
  set reference_id=doc_id 
where user_id=user_id 
SELECT user_id,doc_id from row1,row2;

假设 3doc 是一个包含文档名称的字符串变量。

我无法在同一个查询中更新。

此致, 尼克尔

wCTE 无法更新它刚刚插入的行。一个 CTE 术语不会 "see" 另一个 CTE 术语所做的更改。

引用 the manual:

The sub-statements in WITH are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH, the order in which the specified updates actually happen is unpredictable. All the statements are executed with the same snapshot (see Chapter 13), so they cannot "see" one another's effects on the target tables

Trying to update the same row twice in a single statement is not supported.

换句话说,您不能在单个查询中执行您想要执行的操作,至少不能以您尝试执行的方式执行。

如果您希望在插入行时将 reference_id 设置为与 doc_id 相同,请使用 BEFORE INSERT FOR EACH ROW 触发器来检查 reference_id 是否为 NULL 以及它是否为 NULL是,设置 NEW.reference_id := NEW.doc_id.