首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用insertion返回的ids,用于使用外键插入记录。

使用insertion返回的ids,用于使用外键插入记录。
EN

Stack Overflow用户
提问于 2015-10-29 12:41:13
回答 1查看 473关注 0票数 2

我有张桌子

monster(id serial, name varchar, primary key(id))

我还有另一张桌子

ranged_monster(id_monster integer, distance integer, foreign key(id_monster) references monster)

我想插入两个远程怪物:一个是‘弓箭手妖精’,射程攻击距离为10,另一个是‘龙’,距离为50。我怎样才能在一条指令中做到这一点?

到目前为止,我已经尝试过:

最坏的方式

代码语言:javascript
复制
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的列(外键),那么我可以使用以下解决方案:

代码语言:javascript
复制
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 ... returningthe_ids顺序组合,然后将这些组合的记录插入ranged_monster表中。

如何按照这里的https://stackoverflow.com/questions/31171253/sql-combine-two-tables中的要求将两个表组合起来呢?(它被标记为重复,链接到这个What is the difference between JOIN and UNION?,但这个问题与另一个问题无关。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 13:37:17

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33414552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档