PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Връщане на множество SERIAL стойности от пакетно вмъкване на Posgtres

Можете да използвате 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 стойности от всяко извлечение във вашата транзакция.

Можете да опитате да вземете текущата стойност на последователността в началото и в края на транзакцията и да ги използвате, за да разберете кои стойности на последователността са използвани, но което не е надеждно :

Така че дори вашите последователности да имат кеш стойности на една, все още можете да имате стойности на несъседна последователност във вашата транзакция. Въпреки това може да сте в безопасност, ако кеша на последователността стойност съвпада с броя на INSERT във вашата транзакция, но предполагам, че това ще бъде твърде голямо, за да има смисъл.

АКТУАЛИЗАЦИЯ :Току-що забелязах (благодарение на коментарите на питащия), че има две включени таблици, малко се изгубих в стената от текст.

В такъв случай трябва да можете да използвате текущите ВЛОЖКИ:

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 стойности една по една от INSERT на AutoEntityKey . Може да е необходим някакъв вид скрипт за обработка на ВРЪЩАЩИТЕ стойности. Можете също така да обвиете AutoKeyEntity и свързан AutoKeyEntityListed INSERTs във функция, след което използвайте INTO за да вземете EntityKey стойност и я връща от функцията:

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. PostgreSQL:Нарушение на производителността за свързване на две таблици в отделни схеми

  2. Как да създадете нова база данни с вече инсталирано разширение hstore?

  3. Обединяване на таблици в колони от съставен чужд/първичен ключ в заявка

  4. Какъв трябва да бъде типът на параметъра в Java, когато е клеймо за време без часова зона в postgresql?

  5. Унищожаване на Postgres DB на Heroku