sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man skapar en sekvens om den inte finns

Postgres 9.5 eller senare

IF NOT EXISTS lades till i CREATE SEQUENCE i Postgres 9.5. Det är den enkla lösningen nu:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Men överväg detaljerna i det föråldrade svaret ändå ...
Och du vet om serial eller IDENTITY kolumner, eller hur?

  • Automatisk ökning av tabellkolumnen

Postgres 9.4 eller äldre

Sekvenser delar namnutrymmet med flera andra tabellliknande objekt. Manualen:

Sekvensnamnet måste skilja sig från namnet på någon annansekvens, tabell, index, vy eller främmande tabell i samma schema.

Djärv betoning min. Så det finns tre fall:

  1. Namnet finns inte. -> Skapa sekvens.
  2. Det finns en sekvens med samma namn. -> Gör ingenting? Någon utgång? Någon loggning?
  3. Det finns ett annat objekt i konflikt med samma namn. -> Göra något? Någon utgång? Någon loggning?

Ange vad du ska göra i båda fallen. En DO uttalande kan se ut så här:

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$;

Objekttyper (relkind ) i pg_class enligt manualen:

r =vanlig tabell
i =index
S =sekvens
v =vy
m =materialiserad vy
c =sammansatt typ
t =TOAST-tabell
f =främmande tabell

Relaterat:

  • Hur man kontrollerar om en tabell finns i ett givet schema


  1. Lokala och globala temporära tabeller i SQL Server

  2. Hur man distribuerar Percona Server för MySQL för hög tillgänglighet

  3. Hur ser man typen av en variabel i PL/SQL?

  4. MySQL ATAN2() Funktion – Returnera bågtangenten av 2 värden