Sql 将Insert的结果插入到另一个表中

Sql 将Insert的结果插入到另一个表中,sql,postgresql,Sql,Postgresql,对于PostgreSQL,给出以下表格: CREATE TABLE events ( id BIGSERIAL PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, ); CREATE TABLE event_details ( uuid UUID NOT NULL, signal_strength SMALLINT NOT NULL, event_id INTEGER REFERENCES

对于PostgreSQL,给出以下表格:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
);

CREATE TABLE event_details (
  uuid UUID NOT NULL,
  signal_strength SMALLINT NOT NULL,
  event_id INTEGER REFERENCES events (id) ON DELETE RESTRICT,
  PRIMARY KEY (event_id)
);
要插入事件,必须先插入事件详细信息,然后再插入通用事件,并与事件详细信息链接。我构建此查询就是为了做到这一点:

INSERT INTO event_details VALUES ('B9056867-459D-4F0B-8627-7456C880F54B', 50, (INSERT INTO events VALUES (DEFAULT, '2014-03-21 15:37:44.683081-04') RETURNING id));
但是我得到了这个错误:错误:语法错误在或接近于

所以我不能像使用SELECT一样使用insert插入值。如何将新创建的行id转发到event_details的外键列中

当系统运行时,可能会有很多这样的查询,因此我希望避免在NodeJS中的代码中检索回id,然后在单独的语句中执行第二次插入

谢谢

PS:我简化了表的SQL,但我有一些很好的理由将事件的详细信息与事件分开。有许多事件类型具有不同的详细信息

[编辑]

在这种情况下,正确的做法是:

将新的_事件作为插入事件值默认值,“2014-03-21 15:37:44.683081-04”返回id插入事件_详细信息值“B9056867-459D-4F0B-8627-7456C880F54B”,50,从新的_事件限制1中选择id


感谢Jaffar的解决方案

必须分隔查询,因为插入子查询不是有效的值表达式:


也可以创建一个存储过程。这减少了开销。

PostgreSQL对VALUES子句的扩展解释使其本身可以用作子查询

因此,您可以用以下表格表达您的查询:

WITH new_invoice AS (
    INSERT INTO ...
    RETURNING id
),
v(a,b,c,d) AS (values
  ($27,$28,$29,$30),
  ($31,$32,$33,$34),
  ...
)
INSERT INTO invoiceItems (invoice_id, name, qty, price, description)
 SELECT new_invoice.id, a,b,c,d FROM v, new_invoice;

这假设您希望插入新发票的笛卡尔乘积和值,如果新发票实际上是单行值,这通常是有意义的。

您不应该链接或使用完全过时版本的手册。看看Jaffar的答案,这在当前的Postgres版本中确实是可能的。很抱歉,这并没有改变我们的想法。我已经更新了链接,但仍然不允许使用插入作为表达式值。你看到Jaffar的答案了吗?它像一个符咒一样与。。。像解决方案谢谢我的查询现在看起来是这样的:将新的_事件作为插入事件值默认值,'2014-03-21 15:37:44.683081-04'返回id插入事件_详细信息值'B9056867-459D-4F0B-8627-7456C880F54B',50,从新的_事件限制1中选择id;