Postgres在其他表中插入的值[英] Postgres insert value from insert in other table

本文是小编为大家收集整理的关于Postgres在其他表中插入的值的处理方法,想解了Postgres在其他表中插入的值的问题怎么解决?Postgres在其他表中插入的值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有两张桌子:

CREATE TABLE tbl_a (
id serial primary key NOT NULL,
name text NOT NULL,
tbl_b_reference NOT NULL
)

CREATE TABLE tbl_b (
id serial primary key NOT NULL,
status text)

我想做两次插入.一个在 tbl_b 中,然后在我插入 tbl_a 时使用该插入的 id.

我试过了:

INSERT INTO tbl_a(name, tbl_b_reference) 
VALUES ("myName", (INSERT INTO tbl_b (status) VALUES ('OK') RETURNING id));

但我只收到指向第二个"INTO"的语法错误

ERROR: syntax error at or near "INTO" Position: 68

我该从哪里开始?是否可以在不编写永久函数或创建触发器的情况下做到这一点?我是 postgres 的新手,只知道一些 MySQL/MariaDB 的基础知识.我一直在这里搜索与嵌套插入相关的其他问题,但找不到我设法实际使用的东西,因此非常感谢代码示例.

推荐答案

这种插​​入链需要一个公用的表表达式:

with ta as (
  INSERT INTO tbl_b (status) VALUES ('OK') 
  RETURNING id
)
INSERT INTO tbl_a (name, tbl_b_reference) 
VALUES ('myName', (select id from ta));

另一种选择是简单地使用 lastval() 函数来引用最后生成的序列值:

INSERT INTO tbl_b (status) VALUES ('OK');
INSERT INTO tbl_a (name, tbl_b_reference) 
  VALUES ('myName', lastval());

请注意,您不能有任何其他语句在这两者之间生成序列值.

或者使用currval()函数:

INSERT INTO tbl_b (status) VALUES ('OK');
INSERT INTO tbl_a (name, tbl_b_reference) 
  VALUES ('myName', currval('tbl_b_id_seq'));

'tbl_b_id_seq' 是 Postgres 用于为 serial 列创建的序列的标准名称:

本文地址:https://www.itbaoku.cn/post/1764022.html