U kunt een CTE gebruiken om de waarde uit de reeks eenmaal . op te halen en gebruik het herhaaldelijk :
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
De CTE met een opdracht voor het wijzigen van gegevens vereist Postgres 9.1 of hoger.
Als je niet zeker bent over de naam van de reeks, gebruik jepg_get_serial_sequence()
in plaats daarvan:
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
Als de tabelnaam "foo" mogelijk niet uniek is voor alle schema's in de database, moet u deze schema-kwalificeren. En als de spelling van een naam niet-standaard is, moet je dubbele aanhalingstekens maken:
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
Snelle tests gaven het idee van @Mark aan met lastval()
misschien werk ook:
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
-
Je kunt gewoon
id
achterlaten uit de zoekopdracht, deserial
kolom wordt automatisch toegewezen. Maakt niet uit. -
Er mag geen raceconditie zijn tussen de rijen. Ik citeer de handleiding:
currval
Retourneer de waarde die het meest recentelijk is verkregen door
nextval
voor deze reeks in de huidige sessie. (Er wordt een fout gerapporteerd alsnextval
is nooit aangeroepen voor deze reeks in deze sessie.) Omdat dit een sessie-lokale waarde retourneert, geeft het een voorspelbaar antwoord, ongeacht of andere sessiesnextval
hebben uitgevoerd sinds de huidige sessie.Deze functie vereist
USAGE
ofSELECT
privilege op de reeks.
lastval
Retourneer de waarde die het meest recentelijk is geretourneerd door
nextval
in de huidige sessie. Deze functie is identiek aancurrval
, behalve dat in plaats van de naam van de reeks als argument te nemen, het verwijst naar een willekeurige reeksnextval
meest recentelijk toegepast in de huidige sessie. Het is een fout omlastval
. aan te roepen ifnextval
is nog niet gebeld in de huidige sessie.Deze functie vereist
USAGE
ofSELECT
privilege op de laatst gebruikte reeks.
Vetgedrukte nadruk van mij.
Maar , zoals @Bernard opmerkte, het kan toch mislukken:er is geen garantie dat de standaardwaarde is ingevuld (en nextval()
aangeroepen in het proces) voor lastval()
wordt aangeroepen om de 2e kolom ltree
. te vullen . Dus blijf bij de eerste oplossing en nextval()
zeker weten.