如何在 postgres 上同时通过连接对多个表运行更新查询?

Kim*_*cks 5 postgresql join update

在 MySQL 中,我可以执行这样的查询

UPDATE 
    prd_sectionshapename  se
inner join 
    prd_shape s
ON
    s.id = se.shape_id
SET
   se.company_shape_name = 'ABC',
   s.name_en = 'Another name'
WHERE s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)

在 Postgres 中,我需要分成 2 个查询

UPDATE prd_shape AS s
SET name_en = 'Another name'
WHERE s.serial_number = '1234ST';


UPDATE prd_sectionshapename AS se
SET company_shape_name = 'ABC'
FROM prd_shape s
WHERE se.shape_id = s.id and s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)

我的问题是可以像 MySQL 一样在 1 个查询中完成它吗?

请注意,我在互联网上找到的其他 postgres 更新联接答案通常表明,即使使用了联接,更新效果也仅发生在单个表上。

我的目的是在一个查询中更新多个表。不只是一张桌子。

小智 9

我不明白你为什么要这么做。单个事务中的两个 UPDATE 语句就可以很好地工作,并且与单个语句相比不会产生任何额外的开销。


话虽如此:通过使用可写的公用表表达式是可能的

with shape_update as (
  UPDATE prd_shape
   SET name_en = 'Another name'
  WHERE serial_number = '1234ST'
  returning id, serial_number
)
UPDATE prd_sectionshapename 
  SET company_shape_name = 'ABC'
WHERE (shape_id, serial_number) IN (select id, serial_number from shape_update);
Run Code Online (Sandbox Code Playgroud)

该解决方案确实有一个优点:您必须serial_number仅指定一次该值。但它没有性能或事务优势。