这样的事情可能吗?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
像使用返回值作为值在第二张表中插入对第一张表的引用的行?
这样的事情可能吗?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
像使用返回值作为值在第二张表中插入对第一张表的引用的行?
Answers:
您可以从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();
rows
为(some_query returning ...)
现在可能有效(尚未尝试)。
这种情况的最佳实践。使用RETURNING … INTO
。
INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
请注意这是针对PLPGSQL
RETURNING ... INTO
。
您可以使用以下lastval()
功能:
nextval
对于任何序列,最近获得的返回值
所以像这样:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
只要没有人nextval()
在您的INSERT之间调用任何其他序列(在当前会话中),此方法就可以正常工作。
正如Denis在下面指出的,而我在上面已经警告过,lastval()
如果nextval()
在INSERT之间使用另一个序列访问,使用会使您陷入麻烦。如果在序列上Table1
手动调用了INSERT触发器,nextval()
或者更可能是在具有SERIAL
或BIGSERIAL
主键的表上进行了INSERT,则可能发生这种情况。如果您真的想变得偏执(好东西,毕竟他们真的是您要带您去),那么您可以使用,currval()
但您需要知道相关序列的名称:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
自动生成的序列通常被命名为t_c_seq
wheret
是表名和c
列名,但是您始终可以通过输入以下内容找出psql
答案:
=> \d table_name;
然后查看相关列的默认值,例如:
id | integer | not null default nextval('people_id_seq'::regclass)
仅供参考:lastval()
或多或少是MySQL的PostgreSQL版本LAST_INSERT_ID
。我之所以仅提及这一点,是因为许多人比PostgreSQL对MySQL更熟悉,因此链接lastval()
到熟悉的事物可能会澄清一些事情。
lastval
是在Table1的AFTER INSERT触发器后面可能有基于序列的INSERT。那将在当前会话中,并且可能会lastval()
在您不期望的时候发生变化。