我有一个相关的问题,但这是我的谜题的另一部分.
我想从UPDATEd的行中获取列的OLD VALUE - 不使用触发器(也不使用存储过程,也不使用任何其他额外的非SQL /查询实体).
我的查询是这样的:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
WHERE trans_nbr IN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
)
RETURNING row_id;
Run Code Online (Sandbox Code Playgroud)
如果我可以在子查询结束时执行"FOR UPDATE ON my_table",那将是devine(并修复我的其他问题/问题).但是,这不起作用:不能有这个AND"GROUP BY"(这对于计算trans_nbr的COUNT是必要的).然后我可以直接使用那些trans_nbr并进行查询以获得(即将成为)之前的processing_by值.
我尝试过这样做:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
FROM my_table old_my_table
JOIN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
) sub_my_table
ON old_my_table.trans_nbr = sub_my_table.trans_nbr …Run Code Online (Sandbox Code Playgroud) 我有PostgreSQL 9数据库,它使用自动递增整数作为主键.我想复制表中的一些行(基于某些过滤条件),同时更改一个或两个值,即复制除ID(自动生成)和可能的另一列之外的所有列值.
但是,我还希望获得从旧ID到新ID的映射.有没有更好的方法来执行它然后只查询要先复制的行然后一次插入一个新行?
基本上我想做这样的事情:
INSERT INTO my_table (col1, col2, col3)
SELECT col1, 'new col2 value', col3
FROM my_table old
WHERE old.some_criteria = 'something'
RETURNING old.id, id;
Run Code Online (Sandbox Code Playgroud)
然而,这失败了ERROR: missing FROM-clause entry for table "old",我可以看到原因:Postgres必须首先执行SELECT然后插入它,并且RETURNING子句只能访问新插入的行.