当前位置: 首页 > 面试题库 >

使用从insert into返回的ID,用于通过外键插入记录

麻书
2023-03-14
问题内容

我有桌子

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也具有column distance。这样做,将插入不带的怪物的ID distance

可能的解决方案

创建时间表的距离,然后连同顺序结合这个态表insert into ... returningthe_ids,然后插入该合并的记录到ranged_monster表中。

我如何按照这里https://stackoverflow.com/questions/31171253/sql-combine-two-
tables的
要求合并两个表?(它被标记为重复,链接到此JOIN和UNION有什么区别?,但该问题 另一个问题 无关 。)


问题答案:
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)


 类似资料:
  • 我使用Liquibase insert将两行添加到数据库中,并通过外键链接它们,如下所示: 除了表2中外键的值外,两条记录都正确插入。此值保持为空。因此,“computeValue”属性似乎没有正确执行,但我不明白为什么。我希望在Liquibase中有一个解决方案,而不是在普通SQL中,因为Liquibase提供了一种可能性,可以方便地插入clob字段。 表1:ID- 55228390499230

  • 本文向大家介绍Mybatis返回插入主键id的方法,包括了Mybatis返回插入主键id的方法的使用技巧和注意事项,需要的朋友参考一下 在mapper的xml文件中配置  useGeneratedKeys 以及 keyProperty 返回Id即可 PS:Mybatis中insert中返回主键ID的方法 1、XyzMapper.xml 或 2、XyzMapper.java 3、要在map或c中有一

  • 问题内容: 我正在使用PostgreSQL 9.3。 我想复制一些数据库记录。由于我正在为表使用自动递增的pk ID,因此我想将ID映射从生成的重复记录ID找回原始记录。例如,假设我有一个包含2条记录的表: 使用SQL: 我希望看到类似的映射: 关于如何填写上面的问号以使其起作用的任何想法吗?非常感谢! 问题答案: 这对于来说会更简单,在此子句中可以看到加入到更新中的其他行: 仅使用SQL返回UP

  • 问题内容: 我正在使用iBatis / Java和Postgres 8.3。当我在ibatis中插入时,我需要返回ID。 我使用下表描述我的问题:通过运行create语句自动生成 Sequence 。 目前,我使用以下sql映射: 看来这是检索新插入的id的ibatis方法。Ibatis首先运行INSERT语句,然后向序列询问最后一个ID。 我怀疑这是否可以与许多并发插入一起使用。 我想在ibat

  • 问题内容: 我想检索数据库中插入行的ID,但是我不知道该怎么做。 我尝试使用SQL子句返回,但不起作用。 插入一行后如何返回ID? 问题答案: 在上调用方法后,插入行的ID将位于属性中。只看它。

  • 我试图插入用户记录在房间数据库使用静态编程语言和它的完美工作。 现在我想返回新插入的记录id,以检查记录是否成功插入到房间数据库中。 但是,当我在insert方法中应用长返回类型并运行代码时,我得到以下错误。 错误:方法返回long,但它应该返回以下内容之一: