PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengembalikan beberapa nilai SERIAL dari sisipan batch Posgtres

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan nama zona waktu saat ini di Postgres 9.3?

  2. apa yang dilakukan operator @> di postgres?

  3. Praktik Terbaik Replikasi PostgreSQL - Bagian 2

  4. Kerangka Entitas 6 dengan Npgsql

  5. Bagaimana saya bisa mengakses nilai default kolom Postgres menggunakan ActiveRecord?