Anda dapat menggunakan RETURNING
dengan beberapa nilai:
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)
Jadi Anda menginginkan sesuatu yang lebih seperti ini:
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.
Dan kemudian Anda harus mengumpulkan kembali EntityKey
nilai dari setiap pernyataan dalam transaksi Anda.
Anda dapat mencoba mengambil nilai urutan saat ini di awal dan akhir transaksi dan menggunakannya untuk mengetahui nilai urutan mana yang digunakan tetapi itu tidak dapat diandalkan :
Jadi, meskipun urutan Anda memiliki cache nilai satu Anda masih dapat memiliki nilai urutan yang tidak bersebelahan dalam transaksi Anda. Namun, Anda mungkin aman jika cache urutannya value cocok dengan jumlah INSERT dalam transaksi Anda, tetapi saya rasa itu terlalu besar untuk masuk akal.
PERBARUI :Saya baru menyadari (berkat komentar penanya) bahwa ada dua tabel yang terlibat, agak hilang di dinding teks.
Dalam hal ini, Anda harus dapat menggunakan INSERTS saat ini:
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.
Dan ambil EntityKey
nilai satu per satu dari INSERT pada AutoEntityKey
. Beberapa jenis skrip mungkin diperlukan untuk menangani nilai RETURNING. Anda juga dapat membungkus AutoKeyEntity
dan AutoKeyEntityListed
terkait MASUKKAN dalam suatu fungsi, lalu gunakan INTO
untuk mengambil EntityKey
nilai dan kembalikan dari fungsi:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;