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;