K načtení hodnoty ze sekvence můžete jednou použít CTE a používat jej opakovaně :
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
CTE s příkazem pro úpravu dat vyžaduje Postgres 9.1 nebo novější.
Pokud si nejste jisti názvem sekvence, použijtepg_get_serial_sequence() místo toho:
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
Pokud název tabulky "foo" nemusí být jedinečný napříč všemi schématy v databázi, kvalifikujte jej podle schématu. A pokud je pravopis jakéhokoli jména nestandardní, musíte uvést do uvozovek:
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
Rychlé testy ukázaly @Markův nápad s lastval() možná práce taky:
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
-
Stačí ponechat
idz dotazu,serialsloupec bude přiřazen automaticky. Nezáleží na tom. -
Mezi řádky by neměl být spor. Cituji manuál:
currvalVrátí hodnotu naposledy získanou pomocí
nextvalpro tuto sekvenci v aktuální relaci. (Pokudnextval, je hlášena chyba v této relaci nebyla pro tuto sekvenci nikdy volána.) Protože se vrací místní hodnota relace, dává předvídatelnou odpověď, zda ostatní relace provedlynextvalod aktuální relace.Tato funkce vyžaduje
USAGEneboSELECToprávnění na sekvenci.
lastvalVrátí hodnotu naposledy vrácenou
nextvalv aktuální relaci. Tato funkce je identická s funkcícurrval, kromě že místo názvu sekvence jako argument odkazuje na kteroukoli sekvencinextvalbyl naposledy použit v aktuální relaci. Volánílastvalje chyba ifnextvalještě nebyl volán v aktuální relaci.Tato funkce vyžaduje
USAGEneboSELECToprávnění na poslední použitou sekvenci.
Tučné zdůraznění moje.
Ale , jak poznamenal @Bernard, může to nakonec selhat:není zaručeno, že je vyplněna výchozí hodnota (a nextval() voláno v procesu) před lastval() se volá k vyplnění 2. sloupce ltree . Zůstaňte tedy u prvního řešení a nextval() pro jistotu.