将插入的id插入另一个表

问题描述 投票:0回答:3

场景如下:

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
为空,因为它是从序列自动生成的。我也尝试了触发器
AFTER
插入
FOR EACH ROW
,但结果是一样的。有什么办法可以解决这个问题吗?

sql postgresql triggers primary-key entity-relationship
3个回答
7
投票

为了简单起见,您可以只使用数据修改 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

更详细的相关答案:

或者您可以使用

currval()
lastval()
:


2
投票

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

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

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();

-3
投票

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

插入后,使用

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

您的代码如下所示:

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

易于阅读、维护和理解。

© www.soinside.com 2019 - 2024. All rights reserved.