我想通过一个查询将数据添加到至少三个表中。我想到了这样的事情:
WITH ins AS (
INSERT INTO core.adr
(street, "number", postal_code, city)
VALUES
('test 1', '25a', '00912', 'villageman')
RETURNING id)
INSERT INTO core.adr_information
(idref, info)
SELECT id, 'test data'
FROM ins;
Run Code Online (Sandbox Code Playgroud)
这完全适用于两个表。
这里的主要问题是,所有其他查询都需要id
第一个INSERT
查询的值,这似乎无法通过这种方式进行管理。我认为它可以通过存储过程或事务轻松完成,但我希望解决方案是一个简单而可靠的查询。
我是否忽略了什么?是否有可能以这种方式或另一种方式(没有存储过程*或事务)?
笔记
* Altough,严格来说,Postgres没有已存储过程,只有功能,@Erwin Brandstetter修改正确地通过评论中指出。有关相关信息,请参阅本系列帖子。
我认为您可以轻松地将 CTE 堆叠在一起,如下所示:
WITH ins AS (
INSERT INTO core.adr
(street, "number", postal_code, city)
VALUES
('test 1', '25a', '00912', 'villageman')
RETURNING id),
ins2 AS (
INSERT INTO someothertable
(id, something)
SELECT id, 'something' FROM ins
RETURNING id -- this is necessary for CTE, but not used
)
INSERT INTO core.adr_information
(idref, info)
SELECT id, 'test data'
FROM ins;
Run Code Online (Sandbox Code Playgroud)