PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zwracanie wielu wartości SERIAL z wstawiania partii Posgtres

Możesz użyć RETURNING z wieloma wartościami:

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)

Więc chcesz czegoś bardziej takiego:

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.

A potem będziesz musiał zebrać zwrócony EntityKey wartości z każdego wyciągu w Twojej transakcji.

Możesz spróbować pobrać bieżącą wartość sekwencji na początku i na końcu transakcji i użyć ich, aby dowiedzieć się, które wartości sekwencji zostały użyte, ale to nie jest niezawodne :

Tak więc, nawet jeśli Twoje sekwencje mają cache wartości jednego, nadal możesz mieć nieciągłe wartości sekwencji w swojej transakcji. Możesz być jednak bezpieczny, jeśli cache sekwencji wartość odpowiada liczbie WSTAWEK w Twojej transakcji, ale przypuszczam, że będzie to zbyt duże, aby miało sens.

AKTUALIZUJ :Właśnie zauważyłem (dzięki komentarzom pytającego), że w grę wchodzą dwa tabele, trochę się zagubiłem w ścianie tekstu.

W takim przypadku powinieneś być w stanie użyć obecnych WSTAWEK:

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.

I weź EntityKey wartości pojedynczo z WSTAWEK w AutoEntityKey . Może być potrzebny jakiś skrypt do obsługi wartości RETURNING. Możesz także zawinąć AutoKeyEntity i powiązane AutoKeyEntityListed INSERT w funkcji, a następnie użyj INTO aby pobrać EntityKey wartość i zwróć ją z funkcji:

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. Jak działa Extract() w PostgreSQL

  2. Uzupełnij brakujące wiersze podczas agregacji wielu pól w Postgres

  3. Jak zdefiniować klucz główny automatycznego przyrostu w PostgreSQL?

  4. Odpowiednik unpivot() w PostgreSQL

  5. Wpuszczana aplikacja internetowa CRUD