sql >> Database >  >> RDS >> PostgreSQL

Referentiewaarde van seriële kolom in een andere kolom tijdens dezelfde INSERT

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, de serial 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 als nextval is nooit aangeroepen voor deze reeks in deze sessie.) Omdat dit een sessie-lokale waarde retourneert, geeft het een voorspelbaar antwoord, ongeacht of andere sessies nextval hebben uitgevoerd sinds de huidige sessie.

Deze functie vereist USAGE of SELECT privilege op de reeks.

lastval

Retourneer de waarde die het meest recentelijk is geretourneerd door nextval in de huidige sessie. Deze functie is identiek aan currval , behalve dat in plaats van de naam van de reeks als argument te nemen, het verwijst naar een willekeurige reeks nextval meest recentelijk toegepast in de huidige sessie. Het is een fout om lastval . aan te roepen if nextval is nog niet gebeld in de huidige sessie.

Deze functie vereist USAGE of SELECT 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.



  1. Hoe LTRIM_ORACLE() werkt in MariaDB

  2. Hoe postgresql voor de eerste keer configureren?

  3. SQL Server SHOWPLAN_TEXT

  4. pg -v 0.17.1 installeren