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

5 façons de vérifier si une table existe dans PostgreSQL

Vous trouverez ci-dessous cinq façons de vérifier si une table existe dans une base de données PostgreSQL.

Les pg_tables Afficher

Les pg_tables La vue contient des informations sur chaque table de la base de données.

Nous pouvons l'utiliser pour vérifier si une table donnée existe dans la base de données actuelle :

SELECT EXISTS (
    SELECT FROM 
        pg_tables
    WHERE 
        schemaname = 'public' AND 
        tablename  = 'actor'
    );

Résultat :

True

Dans ce cas, j'obtiens True , ce qui signifie que la table existe (et que j'y ai accès).

Selon votre configuration, vous pouvez obtenir t /f au lieu de True /False .

Les information_schema.tables Afficher

Les information_schema.tables view contient toutes les tables et vues définies dans la base de données actuelle auxquelles l'utilisateur actuel a accès.

Nous pouvons l'utiliser pour vérifier si une table donnée existe et que nous y avons accès :

SELECT EXISTS (
    SELECT FROM 
        information_schema.tables 
    WHERE 
        table_schema LIKE 'public' AND 
        table_type LIKE 'BASE TABLE' AND
        table_name = 'actor'
    );

Résultat :

True

Une autre façon de le faire serait d'obtenir le compte :

SELECT 
    COUNT(table_name)
FROM 
    information_schema.tables 
WHERE 
    table_schema LIKE 'public' AND 
    table_type LIKE 'BASE TABLE' AND
	table_name = 'actor';

Résultat :

1

Le table_type peut être l'un des éléments suivants :

BASE TABLE Table de base persistante (table normale)
VIEW Afficher
FOREIGN Table étrangère
LOCAL TEMPORARY Tableau temporaire

Vous pouvez omettre table_type de votre filtre si vous souhaitez vérifier si le nom existe dans tous les types.

Catalogues système

Les catalogues système sont l'endroit où un SGBDR stocke les métadonnées du schéma, telles que les informations sur les tables et les colonnes, et les informations de comptabilité interne.

Dans Postgres, les catalogues système sont des tables régulières.

Nous pouvons en utiliser deux pour vérifier si une table donnée existe :

SELECT EXISTS (
    SELECT FROM 
        pg_catalog.pg_class c
    JOIN 
        pg_catalog.pg_namespace n ON 
        n.oid = c.relnamespace
    WHERE  
        n.nspname = 'public' AND 
        c.relname = 'actor' AND 
        c.relkind = 'r'
    );

Résultat :

True

Le relkind de r est pour table ordinaire .

Vous pouvez supprimer le relkind filtrez complètement si vous voulez simplement vérifier si oui ou non un objet porte déjà le nom que vous voulez donner à une table.

Ou vous pouvez filtrer par d'autres types.

Voici les options :

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

Le to_regclass() Fonction

Le to_regclass() traduit un nom de relation textuelle en son OID. Si le nom existe, l'OID est renvoyé.

Exemple :

SELECT to_regclass('public.actor');

Résultat :

actor

Si la table n'existe pas, NULL est renvoyé.

Diffuser en regclass

Il est également possible de convertir le nom de la table en type regclass :

SELECT 'public.actor'::regclass

Résultat :

actor

Cependant, si la table n'existe pas, une erreur se produit.

Vérifiez si une table existe déjà avant de la créer

Si vous devez créer la table si elle n'existe pas, vous pouvez utiliser le IF NOT EXISTS clause de la CREATE TABLE déclaration. Si la table n'existe pas, elle sera créée. S'il existe déjà, il ne sera pas créé.

Voir Créer une table uniquement si elle n'existe pas dans PostgreSQL pour un exemple.