Sql 将Insert的结果插入到另一个表中
对于PostgreSQL,给出以下表格: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
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;