如何在子表上进行有效的批量插入以及postgresql中父表上的单个插入?

时间:2016-06-27 11:49:20

标签: sql postgresql

让我们说我有这两张桌子:

create table parent (
  id serial primary key,
  name text not null unique
);

create table child (
  id serial primary key,
  name text not null unique,
  parent_id integer not null references parent(id)
);

如您所见,child表引用了parent表。

我想要做的是在child表上批量插入 如果可能,在单个查询中在parent表上插入单个值。 所以,我必须先用parentwith clause表插入一个值, 然后抓住返回的id并将其插入child表。

例如,我想插入这些值:

  • parent1
  • child1
  • 的child2
  • child3
  • child4

这是我执行此插入的查询:

with x(id) as (
  -- insert parent's name first
  insert into parent (name)
  select 'parent1'
  where not exists (
    select * from parent where name = 'parent1'
  )
  -- get the parent_id
  returning id
), y(parent_id) as (
  -- ensure that parent_id has a value even if the insertion
  -- above is not inserting anything.
  select x.id as parent_id from x
  union
  select parent.id as parent_id from parent where name = 'parent1'
)
-- bulk insert to child table
insert into child (parent_id, name) values
((select parent_id from y limit 1), 'child1'),
((select parent_id from y limit 1), 'child2'),
((select parent_id from y limit 1), 'child3'),
((select parent_id from y limit 1), 'child4');

此查询按预期工作。但是,我怀疑它的效率。因为, 在实际使用中,我将在子表上插入大约300个值。

那么,任何人都可以展示比这个更有效的查询吗?

0 个答案:

没有答案