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
id
z dotazu,serial
sloupec bude přiřazen automaticky. Nezáleží na tom. -
Mezi řádky by neměl být spor. Cituji manuál:
currval
Vrátí hodnotu naposledy získanou pomocí
nextval
pro 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 provedlynextval
od aktuální relace.Tato funkce vyžaduje
USAGE
neboSELECT
oprávnění na sekvenci.
lastval
Vrátí hodnotu naposledy vrácenou
nextval
v aktuální relaci. Tato funkce je identická s funkcícurrval
, kromě že místo názvu sekvence jako argument odkazuje na kteroukoli sekvencinextval
byl naposledy použit v aktuální relaci. Volánílastval
je chyba ifnextval
ještě nebyl volán v aktuální relaci.Tato funkce vyžaduje
USAGE
neboSELECT
oprá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.