使用自动增量主键插入行和相关行

时间:2014-08-06 06:44:28

标签: sql postgresql common-table-expression sql-insert

好的,所以标题很糟糕,但这是我的问题。我有两张桌子:

  • image:其中包含一些基本元数据并且具有autoincrement主键id
  • imagesize:每个图片保存多个不同的尺寸,并且有12个网址,宽度,高度等,并且有image.id的外键,因此image形成一个 - 与imagesize的关系很多。

目前我首先使用INSERT INTO image ... RETURNING image.id创建并覆盖图像,然后使用INSERT INTO imagesize ...创建尺寸,我使用返回的ID。

有没有办法合并这两个INSERT,所以我的代码和数据库之间没有额外的往返?

2 个答案:

答案 0 :(得分:2)

使用data-modifying CTE

WITH ins1 AS (
   INSERT INTO image  ...
   RETURNING id
   )
INSERT INTO imagesize (..., image_id)
SELECT ..., i.id
FROM   ins1 i;

更多解释:

您的解决方案

CROSS JOINVALUES表达式而不是多个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
;

这是SQL Fiddle