web-dev-qa-db-ja.com

postgresで同時に結合を介して複数のテーブルで更新クエリを実行するにはどうすればよいですか?

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';

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';

私の質問は、MySQLのように1つのクエリでそれを行うことは可能ですか?

インターネットで見つけた他のpostgres update joinの回答では、JOINが使用されている場合でも、通常、更新の影響は単一のテーブルでのみ発生することに注意してください。

ここでの目的は、1つのクエリで複数のテーブルを更新することです。 1つのテーブルだけではありません。

1
Kim Stacks

なぜあなたがそうしたいのか分かりません。 1つのトランザクション内の2つのUPDATEステートメントは問題なく機能し、1つのステートメントと比較して追加のオーバーヘッドが発生することはありません。


つまり、それは 書き込み可能な共通テーブル式 を使用することで可能ですです

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);

このソリューションには確かに1つの利点があります。serial_numberの値を一度だけ指定する必要があります。ただし、パフォーマンスやトランザクション上の利点はありません。

Set句の書き込みスコープは1つのテーブルのみを許可する更新部分で言及されているテーブルに制限されているため、postgresqlでは不可能です。句。

0