我建议将两个插入包装在一个查询中数据修改CTE https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-MODIFYING, like:
WITH grp_ins AS (
INSERT INTO groups (name, creator)
VALUES ($1, $2)
RETURNING id, creator
)
INSERT INTO groupmembers (groupid, userid)
SELECT g.id, u.id
FROM grp_ins g
JOIN users u ON u.email = g.creator;
Since groups.creator
被定义为NOT NULL
具有强制引用完整性的 FK 约束,[INNER] JOIN
很好。否则我会考虑LEFT JOIN
.
很像你提到的答案 https://stackoverflow.com/a/21387005/939860到。或者这些:
- 使用 Postgres 一次向 3 个表插入数据 https://stackoverflow.com/questions/20561254/insert-data-in-3-tables-at-a-time-using-postgres/20561627#20561627
- 将插入的id插入到另一个表中 https://stackoverflow.com/questions/27588544/insert-inserted-id-to-another-table/27589070#27589070
如果由于某种原因,您无法强制执行上述命令(例如嵌套在必须用于插入的函数中)groups
), 下一个最好的事情 is a trigger https://www.postgresql.org/docs/current/triggers.html AFTER INSERT
执行第二个INSERT
。稍微复杂一点,成本也高一些。但工作是否:
CREATE OR REPLACE FUNCTION trg_ins_row_in_groupmembers()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO groupmembers (groupid, userid)
SELECT NEW.id, (SELECT u.id FROM users u WHERE u.email = NEW.creator);
RETURN NEW; -- doesn't matter much what you return here
END
$func$ LANGUAGE plpgsql;
还有一个触发器AFTER INSERT
on groups
:
CREATE TRIGGER groups_ins_aft
AFTER INSERT ON groups
FOR EACH ROW EXECUTE PROCEDURE trg_ins_row_in_groupmembers();
Related:
- 对表进行 INSERT 在连接的表中插入数据 https://stackoverflow.com/questions/10119005/on-insert-to-a-table-insert-data-in-connected-tables/10402234#10402234