web-dev-qa-db-ja.com

1つのクエリで複数のテーブルに挿入する

1つのクエリで少なくとも3つのテーブルにデータを追加したいと思います。私はこのようなことを考えました:

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;

ちょうど2つのテーブルで完全に機能します。

ここでの主な問題は、すべての追加のクエリが最初のidクエリからのINSERT値を必要とすることです。これは、この方法では管理できないようです。ストアドプロシージャまたはトランザクションを使用して簡単に実行できると思いますが、ソリューションは単純で確実なクエリにしたいと考えています。

私は何かを見落としているか?それは別の方法で可能ですか(ストアドプロシージャ*やトランザクションはありません)?


*ただし、厳密に言えば、Postgresはストアドプロシージャを持たず、関数のみを扱います @ Erwin Brandstetter はコメントで正しく指摘されています。 関連情報については、この一連の投稿 を参照してください。

9
maxik

次のように、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;
4
mustaccio