105

这样的事情可能吗?

INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));

就像使用返回值作为值在第二个表中插入一行并引用第一个表?

4

6 回答 6

126

你可以从 Postgres 9.1 开始这样做:

with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows

同时,如果您只对 id 感兴趣,则可以使用触发器来执行此操作:

create function t1_ins_into_t2()
  returns trigger
as $$
begin
  insert into table2 (val) values (new.id);
  return new;
end;
$$ language plpgsql;

create trigger t1_ins_into_t2
  after insert on table1
for each row
execute procedure t1_ins_into_t2();
于 2011-07-03T06:24:48.490 回答
69

这种情况的最佳实践。使用RETURNING … INTO.

INSERT INTO teams VALUES (...) RETURNING id INTO last_id;

请注意,这是针对 PLPGSQL

于 2014-10-16T15:12:57.767 回答
17
DO $$
DECLARE tableId integer;
BEGIN
  INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId;
  INSERT INTO Table2 (val) VALUES (tableId);
END $$;

用 psql (10.3, server 9.6.8) 测试

于 2018-04-24T14:51:09.583 回答
15

与丹尼斯·德·伯纳迪(Denis de Bernardy)给出的答案一致。

如果您希望之后也返回 id 并希望在 Table2 中插入更多内容:

with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val
于 2016-11-07T12:42:40.230 回答
9

您可以使用以下lastval()功能:

nextval任何序列最近获得的返回值

所以是这样的:

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (lastval());

只要没有人nextval()在您的 INSERT 之间调用任何其他序列(在当前会话中),这将正常工作。

正如Denis在下面提到的和我在上面警告过的那样,如果在 INSERT 之间lastval()使用另一个序列访问,则使用会给你带来麻烦。nextval()如果在序列上Table1手动调用的 INSERT 触发器有一个 INSERT 触发器,nextval()或者更有可能在具有SERIALBIGSERIAL主键的表上执行 INSERT,则可能会发生这种情况。如果你想变得非常偏执(一件好事,毕竟他们currval()真的是你要得到你),那么你可以使用但你需要知道相关序列的名称:

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (currval('Table1_id_seq'::regclass));

自动生成的序列通常被命名为t_c_seqwheret是 table name 并且c是 column name 但你总是可以通过进入psql并说:

=> \d table_name;

然后查看相关列的默认值,例如:

id | integer | not null default nextval('people_id_seq'::regclass)

仅供参考:lastval()或多或少是 MySQL 的LAST_INSERT_ID. 我只提到这一点是因为很多人比 PostgreSQL 更熟悉 MySQL,所以链接lastval()到熟悉的东西可能会澄清事情。

于 2011-07-03T01:20:19.960 回答
2

table_ex

id 默认 nextval('table_id_seq'::regclass),

camp1 varchar

camp2 varchar

INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id 
于 2016-07-30T18:06:39.760 回答