sql >> Database teknologi >  >> RDS >> PostgreSQL

Referenceværdi for seriel kolonne i en anden kolonne under samme INSERT

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.



  1. TO_YMINTERVAL() Funktion i Oracle

  2. Opret en beregnet kolonne i SQL Server ved hjælp af T-SQL

  3. Fejl ved brug af oracle.dataaccess.dll

  4. Introduktion til PL/SQL-indsamlingsmetoder i Oracle-databasen