Postgresql Postgres从其他表中的insert插入值

Postgresql Postgres从其他表中的insert插入值,postgresql,sql-insert,database-sequence,Postgresql,Sql Insert,Database Sequence,我有两张桌子: 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_

我有两张桌子:

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”的语法错误


我该从这里走到哪里?在不编写永久函数或创建触发器的情况下是否可以做到这一点?我是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为序列创建的标准名称:

我非常喜欢带有。。。正如上面提到的解决方案,因为这是在一个语句中实现这一点的唯一原子解决方案

但是,如果您觉得可以用两个语句来完成,那么还有第四种简单的方法:使用子查询和max()

INSERT INTO tbl_b (status) VALUES ('OK');
INSERT INTO tbl_a (name, tbl_b_reference) 
  VALUES ('myName', (SELECT max(id) FROM tbl_b));
就我个人而言,我觉得这比lastval()好,因为它只取决于这个特定的序列在语句之间不被next()-ed,也比currval()好,因为不需要知道序列名


它也是最可读的解决方案。

“myName”是一个列引用,而不是字符串constantIs这不是外键的用途?另外:
tbl_b_引用非空
需要:
tbl_b_引用整数非空引用tbl_b
@a_horse__与_no_name最后一条注释成功了!谢谢你的帮助!相关的:
INSERT INTO tbl_b (status) VALUES ('OK');
INSERT INTO tbl_a (name, tbl_b_reference) 
  VALUES ('myName', (SELECT max(id) FROM tbl_b));