让我们说我有这两张桌子:
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
表上插入单个值。
所以,我必须先用parent
向with clause
表插入一个值,
然后抓住返回的id
并将其插入child
表。
例如,我想插入这些值:
这是我执行此插入的查询:
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个值。
那么,任何人都可以展示比这个更有效的查询吗?