10

PostgreSQLではRETURNING、ステートメントの最後にINSERT、たとえば、行の主キー値がSERIALタイプによって自動的に設定されたときにその値を返すように配置することができます。

質問:

この値を、他のテーブルに値を挿入するために使用できる変数に格納するにはどうすればよいですか?id生成されたものを複数のテーブルに挿入したいことに注意してください。節は、私が理解しているWITH限り、単一の挿入に対してのみ有用です。これはおそらくPHPで行う必要があると思います。

これは本当に悪いデザインの結果です。自然キーがないと、主キーにハンドルがない限り、一意の行を取得するのは困難です。

4

1 に答える 1

24

...他のテーブルに値を挿入するために使用できますか?

データ変更CTEを使用して、単一のSQLステートメントでそれを行うこともできます。

WITH ins1 AS (
   INSERT INTO tbl1(txt)
   VALUES ('foo')
   RETURNING tbl1_id
   )
INSERT INTO tbl2(tbl1_id)
SELECT * FROM ins1

PostgreSQL9.1以降が必要です。

db <> fiddle here(Postgres 13)
古いsqlfiddle(Postgres 9.6)

質問の更新に返信する

1つのクエリで複数のテーブルに挿入することもできます。

WITH ins1 AS (
   INSERT INTO tbl1(txt)
   VALUES ('bar')
   RETURNING tbl1_id
   )
 , ins2 AS (
   INSERT INTO tbl2(tbl1_id)
   SELECT tbl1_id FROM ins1
   )
INSERT INTO tbl3(tbl1_id)
SELECT tbl1_id FROM ins1;
于 2013-03-26T01:47:35.783 に答える