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.