对于批量插入,我有一个国外参考值。作为插入的一部分,我想同时返回新创建记录的引用和对应的ID,以便在另一个系统中创建映射记录。
使用“ RETURNING”在目标表上工作正常。除了在目标表中创建虚拟列之外,还有什么可以实现我想要做的事情?
绝对不想进行逐行处理。
注意:当前使用版本10.7
在我的示例代码中,我尝试“返回id,source.ref”,但是显然不支持。
create table test( id serial primary key, name varchar);
insert into test( name)
select source.name
from ( values('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c') ) source(ref, name)
returning id --, source.ref
答案 0 :(得分:0)
使用CTE:
WITH a AS (
INSERT ...
RETURNING ...
), b AS (
INSERT ...
RETURNING ...
)
SELECT ...
FROM a JOIN b ON ...
答案 1 :(得分:0)
如果唯一,请参考源代码。尝试这样的事情:
WITH q AS ( INSERT INTO test (name)
SELECT source.name
FROM ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
) AS source (ref, name)
RETURNING * )
SELECT q.id, source.ref
FROM q
JOIN ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
) AS source (ref, name) ON q.name = source.name
但是,如果您想将此映射添加到另一个表中,则可以考虑将查询结构重新构建为类似这样的内容:
INSERT INTO mapping ( ref, id )
SELECT source.ref, ( INSERT INTO test (name) VALUES ( source.name ) RETURNING id )
FROM ( VALUES ('refa', 'name a'), ('refb', 'name b'), ('refc', 'name c')
) AS source (ref, name) )