Du kan bruge en CTE til at hente værdien fra sekvensen én gang og brug det gentagne gange :
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
CTE'en med en datamodificerende kommando kræver Postgres 9.1 eller nyere.
Hvis du ikke er sikker på navnet på sekvensen, skal du brugepg_get_serial_sequence()
i stedet:
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
Hvis tabelnavnet "foo" måske ikke er unikt på tværs af alle skemaer i databasen, skal du skemakvalificere det. Og hvis stavningen af et navn ikke er standard, skal du citere:
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
Hurtige test indikerede @Marks idé med lastval()
måske arbejde også:
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
-
Du kan bare efterlade
id
ud af forespørgslen,serial
kolonne tildeles automatisk. Det gør ingen forskel. -
Der bør ikke være en løbstilstand mellem rækkerne. Jeg citerer manualen:
currval
Returner den senest opnåede værdi af nextval
for denne sekvens i den aktuelle session. (Der rapporteres en fejl, hvis nextval
er aldrig blevet kaldt til denne sekvens i denne session.) Fordi dette returnerer en sessionslokal værdi, giver det et forudsigeligt svar, om andre sessioner har udført nextval
. siden den aktuelle session.
Denne funktion kræver USAGE
eller SELECT
privilegium på rækkefølgen.
lastval
Returner den værdi, der senest er returneret af nextval
i den aktuelle session. Denne funktion er identisk med currval
, undtagen at det i stedet for at bruge sekvensnavnet som et argument refererer til hvilken sekvens nextval
blev senest anvendt i den aktuelle session. Det er en fejl at kalde lastval
hvis nextval
er endnu ikke blevet kaldt i den aktuelle session.
Denne funktion kræver USAGE
eller SELECT
privilegium på den sidst brugte sekvens.
Fed fremhævelse mine.
Men , som @Bernard kommenterede, kan det trods alt mislykkes:der er ingen garanti for, at standardværdien er udfyldt (og nextval()
kaldt i processen) før lastval()
kaldes for at udfylde 2. kolonne ltree
. Så hold dig til den første løsning og nextval()
for at være sikker.