sql >> Database >  >> RDS >> PostgreSQL

Hoe een reeks te maken als deze niet bestaat

Postgres 9.5 of hoger

IF NOT EXISTS is toegevoegd aan CREATE SEQUENCE in Postgres 9.5. Dat is nu de simpele oplossing:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Maar overweeg hoe dan ook details van het verouderde antwoord ...
En je weet van serial of IDENTITY kolommen, toch?

  • Tabelkolom automatisch verhogen

Postgres 9.4 of ouder

Sequenties delen de naamruimte met verschillende andere tabelachtige objecten. De handleiding:

De naam van de reeks moet verschillend zijn van de naam van een anderereeks, tabel, index, weergave of vreemde tabel in hetzelfde schema.

Vetgedrukte nadruk van mij. Er zijn dus drie gevallen:

  1. Naam bestaat niet. -> Reeks maken.
  2. Er bestaat een reeks met dezelfde naam. -> Niets doen? Enige uitvoer? Logboekregistratie?
  3. Er bestaat een ander conflicterend object met dezelfde naam. -> Iets doen? Enige uitvoer? Logboekregistratie?

Geef aan wat u in beide gevallen moet doen. Een DO verklaring kan er als volgt uitzien:

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

Objecttypen (relkind ) in pg_class volgens de handleiding:

r =gewone tabel
i =index
S =volgorde
v =weergave
m =gematerialiseerde weergave
c =samengesteld type
t =TOAST-tabel
f =buitenlandse tabel

Gerelateerd:

  • Hoe te controleren of een tabel in een bepaald schema bestaat


  1. Wat betekent tekenset en sortering precies?

  2. Entity Framework 6 voor MySql (C#) inschakelen in WinForms van Microsoft Visual Studio 2013

  3. Hoe een specifieke waarde zoeken in alle tabellen (PostgreSQL)?

  4. Uitgesloten rijen opnemen in RETURNING from INSERT ... ON CONFLICT