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
idachterlaten uit de zoekopdracht, deserialkolom wordt automatisch toegewezen. Maakt niet uit. -
Er mag geen raceconditie zijn tussen de rijen. Ik citeer de handleiding:
currvalRetourneer de waarde die het meest recentelijk is verkregen door
nextvalvoor deze reeks in de huidige sessie. (Er wordt een fout gerapporteerd alsnextvalis nooit aangeroepen voor deze reeks in deze sessie.) Omdat dit een sessie-lokale waarde retourneert, geeft het een voorspelbaar antwoord, ongeacht of andere sessiesnextvalhebben uitgevoerd sinds de huidige sessie.Deze functie vereist
USAGEofSELECTprivilege op de reeks.
lastvalRetourneer de waarde die het meest recentelijk is geretourneerd door
nextvalin 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 reeksnextvalmeest recentelijk toegepast in de huidige sessie. Het is een fout omlastval. aan te roepen ifnextvalis nog niet gebeld in de huidige sessie.Deze functie vereist
USAGEofSELECTprivilege 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.