我有张桌子
monster(id serial, name varchar, primary key(id))
我还有另一张桌子
ranged_monster(id_monster integer, distance integer, foreign key(id_monster) references monster)
我想插入两个远程怪物:一个是‘弓箭手妖精’,射程攻击距离为10,另一个是‘龙’,距离为50。我怎样才能在一条指令中做到这一点?
到目前为止,我已经尝试过:
最坏的方式
insert into monster(name) values ('archer goblin'), ('dragon');
insert into ranged_monster(distance) values (10) where name='archer goblin';
insert into ranged_monster(distance) values (50) where name='dragon';因为name列允许重复,检索到的记录可能不止一个.而且,必须写两遍怪物的名字似乎不是一个好习惯。
插入.返回
如果表ranged_monster只有id_monster的列(外键),那么我可以使用以下解决方案:
with the_ids as (
insert into monster(name)
values ('archer goblin'), ('dragon')
returning id
)
insert into ranged_monster(id_monster)
select * from the_ids;但是它不起作用,因为ranged_monster也有列distance。这样做,将插入没有distance的怪物的ids。
可能的解决方案
创建一个带有距离的时态表,然后将这个时态表与insert into ... returning的the_ids顺序组合,然后将这些组合的记录插入ranged_monster表中。
如何按照这里的https://stackoverflow.com/questions/31171253/sql-combine-two-tables中的要求将两个表组合起来呢?(它被标记为重复,链接到这个What is the difference between JOIN and UNION?,但这个问题与另一个问题无关。)
发布于 2015-10-29 13:37:17
with s(name, distance) as (
values ('archer goblin', 10), ('dragon', 50)
), the_ids as (
insert into monster(name)
select name
from s
returning id, name
)
insert into ranged_monster (id_monster, distance)
select id, distance
from
s
inner join
the_ids using (name)https://stackoverflow.com/questions/33414552
复制相似问题