sql >> Databáze >  >> RDS >> PostgreSQL

Referenční hodnota sériového sloupce v jiném sloupci při stejném INSERT

K načtení hodnoty ze sekvence můžete jednou použít CTE a používat jej opakovaně :

WITH cte AS (
   SELECT nextval('foo_id_seq') AS id
   )
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM   cte;

CTE s příkazem pro úpravu dat vyžaduje Postgres 9.1 nebo novější.

Pokud si nejste jisti názvem sekvence, použijtepg_get_serial_sequence() místo toho:

WITH i AS (
   SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
   )
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM   i;

Pokud název tabulky "foo" nemusí být jedinečný napříč všemi schématy v databázi, kvalifikujte jej podle schématu. A pokud je pravopis jakéhokoli jména nestandardní, musíte uvést do uvozovek:

pg_get_serial_sequence('"My_odd_Schema".foo', 'id')


Rychlé testy ukázaly @Markův nápad s lastval() možná práce taky:

INSERT INTO foo (ltree) VALUES ('1.' || lastval());
  • Stačí ponechat id z dotazu, serial sloupec bude přiřazen automaticky. Nezáleží na tom.

  • Mezi řádky by neměl být spor. Cituji manuál:

currval

Vrátí hodnotu naposledy získanou pomocí nextval pro tuto sekvenci v aktuální relaci. (Pokud nextval, je hlášena chyba v této relaci nebyla pro tuto sekvenci nikdy volána.) Protože se vrací místní hodnota relace, dává předvídatelnou odpověď, zda ostatní relace provedly nextval od aktuální relace.

Tato funkce vyžaduje USAGE nebo SELECT oprávnění na sekvenci.

lastval

Vrátí hodnotu naposledy vrácenou nextval v aktuální relaci. Tato funkce je identická s funkcí currval , kromě že místo názvu sekvence jako argument odkazuje na kteroukoli sekvenci nextval byl naposledy použit v aktuální relaci. Volání lastval je chyba if nextval ještě nebyl volán v aktuální relaci.

Tato funkce vyžaduje USAGE nebo SELECT oprávnění na poslední použitou sekvenci.

Tučné zdůraznění moje.

Ale , jak poznamenal @Bernard, může to nakonec selhat:není zaručeno, že je vyplněna výchozí hodnota (a nextval() voláno v procesu) před lastval() se volá k vyplnění 2. sloupce ltree . Zůstaňte tedy u prvního řešení a nextval() pro jistotu.



  1. Jaký je výchozí název omezení v Oracle?

  2. Škodlivé, všudypřítomné mýty o výkonu serveru SQL

  3. Vložit nebo aktualizovat Android SQLite

  4. Kontrola více sloupců pro jednu hodnotu