好的,所以标题很糟糕,但这是我的问题。我有两张桌子:
image
:其中包含一些基本元数据并且具有autoincrement
主键id
imagesize
:每个图片保存多个不同的尺寸,并且有12个网址,宽度,高度等,并且有image.id
的外键,因此image
形成一个 - 与imagesize
的关系很多。目前我首先使用INSERT INTO image ... RETURNING image.id
创建并覆盖图像,然后使用INSERT INTO imagesize ...
创建尺寸,我使用返回的ID。
有没有办法合并这两个INSERT,所以我的代码和数据库之间没有额外的往返?
答案 0 :(得分:2)
WITH ins1 AS (
INSERT INTO image ...
RETURNING id
)
INSERT INTO imagesize (..., image_id)
SELECT ..., i.id
FROM ins1 i;
更多解释:
CROSS JOIN
到VALUES
表达式而不是多个SELECT
语句:
WITH new_img AS (
INSERT INTO image (description)
VALUES ('An awesome image')
RETURNING id
)
INSERT INTO imagesize (image_id, name, url)
SELECT i.id, v.name, v.url
FROM new_img i
CROSS JOIN (
VALUES
('small' , 'http://example.com/img_2_small.jpg')
,('medium', 'http://example.com/img_2_medium.jpg')
,('large' , 'http://example.com/img_2_large.jpg')
) v (name, url);
答案 1 :(得分:1)
Erwin Brandstetter指出了我正确的方向。由于我需要插入多行,查询看起来有点奇怪,但它可以工作:
WITH new_img AS (
INSERT INTO image (description) VALUES ('An awesome image') RETURNING id
)
INSERT INTO imagesize (image_id, name, url)
SELECT new_img.id, 'small', 'http://example.com/img_2_small.jpg' FROM new_img
UNION ALL SELECT new_img.id, 'medium', 'http://example.com/img_2_medium.jpg' FROM new_img
UNION ALL SELECT new_img.id, 'large', 'http://example.com/img_2_large.jpg' FROM new_img
;