Im Folgenden finden Sie fünf Möglichkeiten, um zu überprüfen, ob eine Tabelle in einer PostgreSQL-Datenbank vorhanden ist.
Die pg_tables
Anzeigen
Die pg_tables
view enthält Informationen über jede Tabelle in der Datenbank.
Wir können damit prüfen, ob eine bestimmte Tabelle in der aktuellen Datenbank existiert:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Ergebnis:
True
In diesem Fall bekomme ich True
, was bedeutet, dass die Tabelle existiert (und ich Zugriff darauf habe).
Abhängig von Ihrer Konfiguration erhalten Sie möglicherweise t
/f
statt True
/False
.
Die information_schema.tables
Anzeigen
Die information_schema.tables
view enthält alle in der aktuellen Datenbank definierten Tabellen und Ansichten, auf die der aktuelle Benutzer Zugriff hat.
Wir können es verwenden, um zu überprüfen, ob eine bestimmte Tabelle existiert und ob wir Zugriff darauf haben:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Ergebnis:
True
Eine andere Möglichkeit wäre, die Anzahl zu ermitteln:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Ergebnis:
1
Der table_type
kann einer der folgenden sein:
BASE TABLE | Persistente Basistabelle (normale Tabelle) |
VIEW | Anzeigen |
FOREIGN | Fremdtisch |
LOCAL TEMPORARY | Temporäre Tabelle |
Sie können table_type
weglassen aus Ihrem Filter, wenn Sie prüfen möchten, ob der Name über alle Typen hinweg existiert.
Systemkataloge
Die Systemkataloge sind der Ort, an dem ein RDBMS Schema-Metadaten wie Informationen zu Tabellen und Spalten sowie interne Buchhaltungsinformationen speichert.
In Postgres sind Systemkataloge reguläre Tabellen.
Wir können zwei davon verwenden, um zu prüfen, ob eine bestimmte Tabelle existiert:
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'
);
Ergebnis:
True
Das relkind
von r
ist für gewöhnlichen Tisch .
Sie können das relkind
entfernen ganz filtern, wenn Sie nur prüfen möchten, ob ein Objekt bereits den Namen hat, den Sie einer Tabelle geben möchten.
Oder Sie können nach anderen Typen filtern.
Hier sind die Optionen:
r | gewöhnlicher Tisch |
i | Index |
S | Reihenfolge |
t | TOAST-Tabelle |
v | ansehen |
m | materialisierte Ansicht |
c | zusammengesetzter Typ |
f | fremde Tabelle |
p | partitionierte Tabelle |
I | partitionierter Index |
Der to_regclass()
Funktion
Die to_regclass()
Funktion übersetzt einen textuellen Beziehungsnamen in seine OID. Wenn der Name existiert, wird die OID zurückgegeben.
Beispiel:
SELECT to_regclass('public.actor');
Ergebnis:
actor
Wenn die Tabelle nicht existiert, wird NULL zurückgegeben.
In regclass
umwandeln
Es ist auch möglich, den Tabellennamen in den Typ regclass
umzuwandeln :
SELECT 'public.actor'::regclass
Ergebnis:
actor
Wenn die Tabelle jedoch nicht existiert, tritt ein Fehler auf.
Überprüfen Sie, ob eine Tabelle bereits existiert, bevor Sie sie erstellen
Wenn Sie die Tabelle erstellen müssen, wenn sie nicht existiert, können Sie den IF NOT EXISTS
verwenden -Klausel von CREATE TABLE
Erklärung. Wenn die Tabelle nicht existiert, wird sie erstellt. Wenn es bereits existiert, wird es nicht erstellt.
Ein Beispiel finden Sie unter Tabelle nur erstellen, wenn sie in PostgreSQL nicht vorhanden ist.