繁体   English   中英

将插入的id插入另一个表

[英]Insert inserted id to another table

这是场景:

create table a (
 id serial primary key,
 val text
);

create table b (
 id serial primary key,
 a_id integer references a(id)
);

create rule a_inserted as on insert to a do also insert into b (a_id) values (new.id);

我试图创建一个记录b引用到a上插入到a表。 但我得到的是new.id为null,因为它是从序列自动生成的。 我也尝试了插入FOR EACH ROW AFTER的触发器,但结果是一样的。 有办法解决这个问题吗?

避免规则,因为他们会回来咬你。

对每行运行的表a使用after触发器。 它应该看起来像这样(未经测试):

create function a_ins() returns trigger as $$
begin
  insert into b (a_id) values (new.id);
  return null;
end;
$$ language plpgsql;

create trigger a_ins after insert on a
for each row execute procedure a_ins();

为了简单起见,您还可以使用数据修改CTE (并且没有触发器或规则):

WITH ins_a AS (
   INSERT INTO a(val)
   VALUES ('foo')
   RETURNING a_id
   )
INSERT INTO b(a_id)
SELECT a_id
FROM   ins_a
RETURNING b.*;  -- last line optional if you need the values in return

相关答案详情如下:

或者你可以使用currval()lastval()

不要使用触发器或其他数据库功夫。 这种情况发生在世界某个地方 - 有一个简单的解决方案:

插入后,使用LASTVAL()函数,该函数返回自动递增的最后一个序列的值。

您的代码如下所示:

insert into a (val) values ('foo');
insert into b (a_id, val) values (lastval(), 'bar');

易于阅读,维护和理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM