Vous pouvez utiliser RETURNING
avec plusieurs valeurs :
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)
Donc, vous voulez quelque chose de plus comme ceci :
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.
Et ensuite, vous devrez rassembler le EntityKey
renvoyé valeurs de chaque relevé de votre transaction.
Vous pouvez essayer de saisir la valeur actuelle de la séquence au début et à la fin de la transaction et les utiliser pour déterminer quelles valeurs de séquence ont été utilisées, mais qui n'est pas fiable :
Ainsi, même si vos séquences ont un cache valeurs de un, vous pouvez toujours avoir des valeurs de séquence non contiguës dans votre transaction. Cependant, vous pourriez être en sécurité si le cache de la séquence la valeur correspond au nombre d'INSERTS dans votre transaction, mais je suppose que cela va être trop grand pour avoir un sens.
MISE À JOUR :Je viens de remarquer (grâce aux commentaires du questionneur) qu'il y a deux tableaux impliqués, je me suis un peu perdu dans le mur de texte.
Dans ce cas, vous devriez pouvoir utiliser les INSERTS actuels :
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.
Et saisissez le EntityKey
valeurs une à la fois à partir des INSERTs sur AutoEntityKey
. Une sorte de script peut être nécessaire pour gérer les valeurs RETURNING. Vous pouvez également envelopper le AutoKeyEntity
et AutoKeyEntityListed
associé INSERT dans une fonction, puis utilisez INTO
pour récupérer la EntityKey
valeur et la renvoyer depuis la fonction :
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;