PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer une séquence si elle n'existe pas

Postgres 9.5 ou version ultérieure

IF NOT EXISTS a été ajouté à CREATE SEQUENCE dans Postgres 9.5. C'est la solution simple maintenant :

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Mais considérez quand même les détails de la réponse obsolète ...
Et vous connaissez serial ou IDENTITY colonnes, n'est-ce pas ?

  • Colonne de tableau d'incrémentation automatique

Postgres 9.4 ou version antérieure

Les séquences partagent l'espace de noms avec plusieurs autres objets de type table. Le manuel :

Le nom de la séquence doit être distinct du nom de toute autreséquence, table, index, vue ou table étrangère dans le même schéma.

Bold emphase mienne. Il y a donc trois cas :

  1. Le nom n'existe pas. -> Créer une séquence.
  2. Une séquence portant le même nom existe. -> Ne rien faire ? Une sortie ? Une journalisation ?
  3. Un autre objet en conflit portant le même nom existe. -> Faire quelque chose ? Une sortie ? Une journalisation ?

Spécifiez ce qu'il faut faire dans les deux cas. A DO l'instruction pourrait ressembler à ceci :

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

Types d'objets (relkind ) dans pg_class selon le manuel :

r =table ordinaire
i =index
S =séquence
v =vue
m =vue matérialisée
c =type composite
t =table TOAST
f =table étrangère

Connexe :

  • Comment vérifier si une table existe dans un schéma donné