web-dev-qa-db-ja.com

複数のテーブルへの一括挿入

いくつかの一括挿入を実行する2つのテーブルがあります。

  1. キー:key_id(pk)、key_name
  2. related_key:related_key_id(pk)、key_id(fk)

最初INSERT

values_data = "($$key_1$$), ($$key_2$$)"

INSERT INTO key (key_name) VALUES values_data

INSERT

values_data = "(1, `the id of the first value inserted in key`)
             , (1, `the id of the sec value inserted in key`)"

INSERT INTO related_key (related_key_id, key_id) VALUES values_data

INSERTテーブルに挿入された行のIDを取得する方法がわからないため、2番目のkeyを実行する方法がわかりません。

またはこれを行うより良い方法はありますか?

2
RockNinja

data-modifying CTE を使用して、単一のステートメントで挿入をチェーンします。

あなたの例から、すべての行の1related_key_idを挿入するとします。

WITH ins_key AS (
   INSERT INTO key (key_name)
   VALUES ($$key_1$$)
        , ($$key_2$$)
   RETURNING key_id       -- return newly generated key_id(s)
   )
INSERT INTO related_key (related_key_id, key_id) 
SELECT 1, key_id
FROM   ins_key;
6