sql >> データベース >  >> RDS >> PostgreSQL

Posgtresバッチ挿入から複数のSERIAL値を返す

    RETURNINGを使用できます 複数の値を持つ場合:

    psql=> create table t (id serial not null, x varchar not null);
    psql=> insert into t (x) values ('a'),('b'),('c') returning id;
     id 
    ----
      1
      2
      3
    (3 rows)
    

    したがって、次のようなものが必要です:

    INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
    ('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
    returning EntityKey;
    INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2)
    returning EntityKey;
    -- etc.
    

    次に、返されたEntityKeyを収集する必要があります トランザクションの各ステートメントの値。

    トランザクションの開始時と終了時にシーケンスの現在の値を取得し、それらを使用して、使用されたシーケンス値を特定することができますが、信頼性が低い

    したがって、シーケンスにキャッシュがある場合でも 1の値でも、トランザクションで連続していないシーケンス値を持つことができます。ただし、シーケンスのキャッシュがあれば、安全な場合があります。 値はトランザクション内のINSERTの数と一致しますが、それは大きすぎて意味がないと思います。

    更新 :(質問者のコメントのおかげで)2つのテーブルが関係していて、テキストの壁で少し迷子になっていることに気づきました。

    その場合、現在のINSERTSを使用できるはずです:

    INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
    ('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
    returning EntityKey;
    INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
    (CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2);
    -- etc.
    

    そして、EntityKeyを取得します AutoEntityKeyのINSERTから一度に1つずつ値を指定します 。 RETURNING値を処理するには、ある種のスクリプトが必要になる場合があります。 AutoKeyEntityをラップすることもできます および関連するAutoKeyEntityListed 関数に挿入してから、を使用しますINTO EntityKeyを取得するには 値を取得し、関数から返します:

    INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
    /* AutoKeyEntityListed INSERTs ... */
    RETURN ek;
    


    1. すべてのデータベース名を表示する

    2. WindowsでのMySQLのオートコンプリート

    3. 1つのクエリ内でSETとSELECT?

    4. 完成したJavaプロジェクト、現在jarまたは.exeファイルを作成しています(データベースを使用)