120 votes

Vérifiez si un type défini par l'utilisateur existe déjà dans PostgreSQL

Disons que j'ai créé des types définis par l'utilisateur dans la base de données,

c'est-à-dire CREATE TYPE abc ...

Est-il alors possible de déterminer si le type défini par l'utilisateur existe ou non ? Peut-être, en utilisant l'une des tables d'informations postgres ?

La raison principale en est que PostgreSQL ne semble pas prendre en charge CREATE OR REPLACE TYPE ... , et si un certain type est créé plus d'une fois, je veux pouvoir supprimer celui qui existe en premier, puis recharger le nouveau une.

129voto

bluish Points 5503

J'ajoute ici la solution complète pour créer des types dans un script simple, sans avoir besoin de créer une fonction juste à cet effet.

 --create types
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'my_type') THEN
        CREATE TYPE my_type AS
        (
            --my fields here...
        );
    END IF;
    --more types here...
END$$;

105voto

rog Points 1304

La solution la plus simple que j'ai trouvée jusqu'à présent qui gère les schémas, inspirée de la réponse de @Cromax, est la suivante :

 DO $$ BEGIN
    CREATE TYPE my_type AS (/* fields go here */);
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;

Exactement ce à quoi vous pouvez vous attendre vraiment - nous encapsulons simplement l'instruction CREATE TYPE dans un gestionnaire d'exceptions afin qu'elle n'interrompe pas la transaction en cours.

51voto

Nulik Points 465

En effet, Postgres n'a pas de fonctionnalité CREATE OR REPLACE pour les types. Donc la meilleure approche est de le laisser tomber :

 DROP TYPE IF EXISTS YOUR_TYPE;
CREATE TYPE YOUR_TYPE AS (
    id      integer,
    field   varchar
);

Une solution simple est toujours la meilleure.

30voto

mu is too short Points 205090

Vous pouvez regarder dans le tableau pg_type

 select exists (select 1 from pg_type where typname = 'abc');

Si cela est vrai, alors abc existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X