插入语句,从源表返回列

时间:2019-06-27 06:24:31

标签: postgresql sql-returning

对于批量插入,我有一个国外参考值。作为插入的一部分,我想同时返回新创建记录的引用和对应的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

2 个答案:

答案 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) )