Nedenfor er fem måder at kontrollere, om der findes en tabel i en PostgreSQL-database.
pg_tables
Vis
pg_tables
visningen indeholder oplysninger om hver tabel i databasen.
Vi kan bruge den til at kontrollere, om en given tabel findes i den aktuelle database:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Resultat:
True
I dette tilfælde får jeg True
, hvilket betyder, at tabellen eksisterer (og jeg har adgang til den).
Afhængigt af din konfiguration kan du få t
/f
i stedet for True
/False
.
information_schema.tables
Vis
information_schema.tables
view indeholder alle tabeller og visninger defineret i den aktuelle database, som den aktuelle bruger har adgang til.
Vi kan bruge den til at kontrollere, om en given tabel eksisterer, og at vi har adgang til den:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Resultat:
True
En anden måde at gøre det på ville være at få optællingen:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Resultat:
1
table_type
kan være en af følgende:
BASE TABLE | Persistent basistabel (normal tabel) |
VIEW | Vis |
FOREIGN | Udenlandsk tabel |
LOCAL TEMPORARY | Midlertidig tabel |
Du kan udelade table_type
fra dit filter, hvis du vil kontrollere, om navnet findes på tværs af alle typer.
Systemkataloger
Systemkatalogerne er stedet, hvor en RDBMS gemmer skemametadata, såsom information om tabeller og kolonner og interne bogføringsoplysninger.
I Postgres er systemkataloger almindelige tabeller.
Vi kan bruge to af dem til at kontrollere, om en given tabel eksisterer:
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'
);
Resultat:
True
relkind
af r
er til almindelig tabel .
Du kan fjerne relkind
filtrer helt, hvis du blot vil kontrollere, om et objekt allerede har det navn, du vil give til en tabel.
Eller du kan filtrere efter andre typer.
Her er mulighederne:
r | almindelig tabel |
i | indeks |
S | sekvens |
t | TOAST bord |
v | visning |
m | materialiseret visning |
c | sammensat type |
f | fremmed tabel |
p | opdelt tabel |
I | partitioneret indeks |
to_regclass()
Funktion
to_regclass()
funktion oversætter et tekstrelationsnavn til dets OID. Hvis navnet eksisterer, returneres OID.
Eksempel:
SELECT to_regclass('public.actor');
Resultat:
actor
Hvis tabellen ikke eksisterer, returneres NULL.
Cast til regclass
Det er også muligt at caste tabelnavnet til at skrive regclass
:
SELECT 'public.actor'::regclass
Resultat:
actor
Men hvis tabellen ikke eksisterer, opstår der en fejl.
Tjek, om der allerede findes en tabel, før du opretter den
Hvis du har brug for at oprette tabellen, hvis den ikke findes, kan du bruge IF NOT EXISTS
klausul i CREATE TABLE
udmelding. Hvis tabellen ikke eksisterer, oprettes den. Hvis den allerede findes, bliver den ikke oprettet.
Se Opret kun en tabel, hvis den ikke findes i PostgreSQL for et eksempel.