【发布时间】:2014-04-29 10:49:58
【问题描述】:
对于 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));
但我收到此错误:错误:“INTO”处或附近的语法错误
所以我不能像使用SELECT 那样插入带有INSERT INTO 的值。如何将新创建的row id转发到event_details的外键列?
系统运行时可能会有很多这样的查询,所以我想避免在我的代码(在 NodeJS 中)中检索 id,然后在单独的语句中执行第二个 INSERT。
谢谢!
PS : 我简化了表的 SQL,但我有充分的理由将 event_details 与事件分开(有许多不同细节的事件类型)。
[编辑]
在这种情况下,正确的做法是:
WITH new_event AS (INSERT INTO events VALUES (DEFAULT, '2014-03-21 15:37:44.683081-04') RETURNING id) INSERT INTO event_details VALUES ('B9056867-459D-4F0B-8627-7456C880F54B', 50, (SELECT id FROM new_event LIMIT 1));
感谢 Jaffar 的 answer 提供此解决方案!
【问题讨论】:
标签: sql postgresql