PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erstellen Sie eine Sequenz, falls nicht vorhanden

Postgres 9.5 oder höher

IF NOT EXISTS wurde zu CREATE SEQUENCE hinzugefügt in Postgres 9.5. Das ist jetzt die einfache Lösung:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Aber bedenken Sie trotzdem die Details der veralteten Antwort ...
Und Sie kennen sich mit serial aus oder IDENTITY Spalten, richtig?

  • Tabellenspalte automatisch erhöhen

Postgres 9.4 oder älter

Sequenzen teilen sich den Namensraum mit mehreren anderen tabellenähnlichen Objekten. Das Handbuch:

Der Sequenzname muss sich vom Namen aller anderen Sequenzen, Tabellen, Indizes, Ansichten oder Fremdtabellen unterscheiden im gleichen Schema.

Fette Hervorhebung von mir. Es gibt also drei Fälle:

  1. Name existiert nicht. -> Sequenz erstellen.
  2. Sequenz mit demselben Namen existiert. -> Nichts tun? Irgendeine Ausgabe? Protokollierung?
  3. Es existiert ein anderes widersprüchliches Objekt mit demselben Namen. -> Etwas tun? Irgendeine Ausgabe? Protokollierung?

Geben Sie an, was in beiden Fällen zu tun ist. Ein DO Anweisung könnte so aussehen:

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

Objekttypen (relkind ) in pg_class laut Handbuch:

r =gewöhnliche Tabelle
i =Index
S =Sequenz
v =Ansicht
m =materialisierte Ansicht
c =zusammengesetzter Typ
t =TOAST-Tabelle
f =fremde Tabelle

Verwandte:

  • Überprüfen, ob eine Tabelle in einem bestimmten Schema existiert