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 :
- Le nom n'existe pas. -> Créer une séquence.
- Une séquence portant le même nom existe. -> Ne rien faire ? Une sortie ? Une journalisation ?
- 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é