Hieronder staan vijf manieren om te controleren of een tabel bestaat in een PostgreSQL-database.
De pg_tables
Bekijk
De pg_tables
view bevat informatie over elke tabel in de database.
We kunnen het gebruiken om te controleren of een bepaalde tabel in de huidige database bestaat:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Resultaat:
True
In dit geval krijg ik True
, wat betekent dat de tabel bestaat (en ik heb er toegang toe).
Afhankelijk van uw configuratie krijgt u mogelijk t
/f
in plaats van True
/False
.
De information_schema.tables
Bekijk
De information_schema.tables
view bevat alle tabellen en views die zijn gedefinieerd in de huidige database waartoe de huidige gebruiker toegang heeft.
We kunnen het gebruiken om te controleren of een bepaalde tabel bestaat en of we er toegang toe hebben:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Resultaat:
True
Een andere manier om dit te doen zou zijn om de telling te krijgen:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Resultaat:
1
De table_type
kan een van de volgende zijn:
BASE TABLE | Persistente basistabel (normale tabel) |
VIEW | Bekijken |
FOREIGN | Buitenlandse tafel |
LOCAL TEMPORARY | Tijdelijke tafel |
U kunt table_type
weglaten uit uw filter als u wilt controleren of de naam in alle typen voorkomt.
Systeemcatalogi
De systeemcatalogi zijn de plaats waar een RDBMS schemametadata opslaat, zoals informatie over tabellen en kolommen, en interne boekhoudinformatie.
In Postgres zijn systeemcatalogi gewone tabellen.
We kunnen er twee gebruiken om te controleren of een bepaalde tabel bestaat:
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'
);
Resultaat:
True
De relkind
van r
is voor gewone tafel .
U kunt de relkind
. verwijderen filter helemaal als u gewoon wilt controleren of een object al de naam heeft die u aan een tabel wilt geven.
Of u kunt filteren op andere typen.
Dit zijn de opties:
r | gewone tafel |
i | index |
S | reeks |
t | TOAST-tabel |
v | bekijken |
m | gematerialiseerde weergave |
c | composiettype |
f | buitenlandse tafel |
p | gepartitioneerde tabel |
I | gepartitioneerde index |
De to_regclass()
Functie
De to_regclass()
functie vertaalt een tekstuele relatienaam naar zijn OID. Als de naam bestaat, wordt de OID geretourneerd.
Voorbeeld:
SELECT to_regclass('public.actor');
Resultaat:
actor
Als de tabel niet bestaat, wordt NULL geretourneerd.
Cast naar regclass
Het is ook mogelijk om de tabelnaam te casten naar regclass
:
SELECT 'public.actor'::regclass
Resultaat:
actor
Als de tabel echter niet bestaat, treedt er een fout op.
Controleer of een tabel al bestaat voordat u deze maakt
Als u de tabel moet maken als deze niet bestaat, kunt u de IF NOT EXISTS
gebruiken clausule van de CREATE TABLE
uitspraak. Als de tabel niet bestaat, wordt deze gemaakt. Als het al bestaat, wordt het niet gemaakt.
Zie Alleen een tabel maken als deze niet in PostgreSQL bestaat voor een voorbeeld.