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

Jak vytvořit sekvenci, pokud neexistuje

Postgres 9.5 nebo novější

IF NOT EXISTS byl přidán do CREATE SEQUENCE v Postgresu 9.5. To je nyní jednoduché řešení:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Ale přesto zvažte podrobnosti zastaralé odpovědi ...
A víte o serial nebo IDENTITY sloupce, že?

  • Automaticky zvyšovat sloupec tabulky

Postgres 9.4 nebo starší

Sekvence sdílejí jmenný prostor s několika dalšími objekty podobnými tabulkám. Manuál:

Název sekvence se musí lišit od názvu jakékoli jinésekvence, tabulky, indexu, pohledu nebo cizí tabulky ve stejném schématu.

Odvážný důraz můj. Takže existují tři případy:

  1. Jméno neexistuje. -> Vytvořit sekvenci.
  2. Existuje sekvence se stejným názvem. -> Nedělat nic? Nějaký výstup? Nějaké protokolování?
  3. Existuje jiný konfliktní objekt se stejným názvem. -> Udělat něco? Nějaký výstup? Nějaké protokolování?

Určete, co dělat v obou případech. DO výpis může vypadat takto:

DO
$do$
DECLARE
   _kind "char";
BEGIN
   SELECT relkind
   FROM   pg_class
   WHERE  oid = 'myschema.myseq'::regclass  -- sequence name, optionally schema-qualified
   INTO  _kind;

   IF NOT FOUND THEN       -- name is free
      CREATE SEQUENCE myschema.myseq;
   ELSIF _kind = 'S' THEN  -- sequence exists
      -- do nothing?
   ELSE                    -- object name exists for different kind
      -- do something!
   END IF;
END
$do$;

Typy objektů (relkind ) v pg_class podle manuálu:

r =běžná tabulka
i =index
S =sekvence
v =pohled
m =materializovaný pohled
c =složený typ
t =tabulka TOAST
f =cizí tabulka

Související:

  • Jak zkontrolovat, zda tabulka v daném schématu existuje


  1. Ukončení nečinných připojení mysql

  2. Rozdíl mezi VARCHAR2(10 CHAR) a NVARCHAR2(10)

  3. Průsečíky SQL a ukázky

  4. Existuje způsob, jak nastavit čas vypršení platnosti, po kterém se záznam dat v PostgreSQL automaticky smaže?