U kunt RETURNING
. gebruiken met meerdere waarden:
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)
Dus je wilt meer zoals dit:
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.
En dan moet je de geretourneerde EntityKey
. verzamelen waarden van elk afschrift in uw transactie.
Je zou kunnen proberen de huidige waarde van de reeks aan het begin en einde van de transactie te pakken en die gebruiken om erachter te komen welke reekswaarden werden gebruikt, maar dat is niet betrouwbaar :
Dus zelfs als uw reeksen cache . hebben waarden van één kunt u nog steeds niet-aaneengesloten reekswaarden in uw transactie hebben. U kunt echter veilig zijn als de cache . van de reeks waarde komt overeen met het aantal INSERT's in uw transactie, maar ik vermoed dat dat te groot zal zijn om logisch te zijn.
UPDATE :Ik merkte net (dankzij de opmerkingen van de vraagsteller) dat er twee tabellen bij betrokken zijn, raakte een beetje verdwaald in de tekstmuur.
In dat geval zou u de huidige INSERTS moeten kunnen gebruiken:
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.
En pak de EntityKey
waarden één voor één uit de INSERT's op AutoEntityKey
. Er kan een soort script nodig zijn om de RETURNING-waarden te verwerken. U kunt ook de AutoKeyEntity
en gerelateerde AutoKeyEntityListed
INSERTs in een functie, gebruik dan INTO
om de EntityKey
te pakken waarde en retourneer het van de functie:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;