Poniżej znajduje się pięć sposobów sprawdzenia, czy tabela istnieje w bazie danych PostgreSQL.
pg_tables
Zobacz
pg_tables
widok zawiera informacje o każdej tabeli w bazie danych.
Możemy go użyć do sprawdzenia, czy dana tabela istnieje w bieżącej bazie danych:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Wynik:
True
W tym przypadku otrzymuję True
, co oznacza, że tabela istnieje (i mam do niej dostęp).
W zależności od konfiguracji możesz otrzymać t
/f
zamiast True
/False
.
information_schema.tables
Zobacz
information_schema.tables
widok zawiera wszystkie tabele i widoki zdefiniowane w bieżącej bazie danych, do których bieżący użytkownik ma dostęp.
Za jego pomocą możemy sprawdzić, czy dana tabela istnieje i czy mamy do niej dostęp:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Wynik:
True
Innym sposobem na to byłoby uzyskanie wyniku:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Wynik:
1
table_type
może być jednym z następujących:
BASE TABLE | Stała tabela podstawowa (normalna tabela) |
VIEW | Widok |
FOREIGN | Obcy stół |
LOCAL TEMPORARY | Tabela tymczasowa |
Możesz pominąć table_type
z filtra, jeśli chcesz sprawdzić, czy nazwa istnieje we wszystkich typach.
Katalogi systemowe
Katalogi systemowe to miejsce, w którym RDBMS przechowuje metadane schematu, takie jak informacje o tabelach i kolumnach oraz wewnętrzne informacje księgowe.
W Postgres katalogi systemowe to zwykłe tabele.
Możemy użyć dwóch z nich, aby sprawdzić, czy dana tabela istnieje:
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'
);
Wynik:
True
relkind
z r
dotyczy zwykłego stołu .
Możesz usunąć relkind
filtruj całkowicie, jeśli chcesz po prostu sprawdzić, czy obiekt ma już nazwę, którą chcesz nadać tabeli.
Możesz też filtrować według innych typów.
Oto opcje:
r | zwykła tabela |
i | indeks |
S | sekwencja |
t | Stół TOSTY |
v | widok |
m | widok zmaterializowany |
c | typ złożony |
f | obcy stół |
p | partycjonowana tabela |
I | partycjonowany indeks |
to_regclass()
Funkcja
to_regclass()
funkcja tłumaczy nazwę relacji tekstowej na jej OID. Jeśli nazwa istnieje, zwracany jest OID.
Przykład:
SELECT to_regclass('public.actor');
Wynik:
actor
Jeśli tabela nie istnieje, zwracana jest wartość NULL.
Przesyłaj do regclass
Możliwe jest również rzutowanie nazwy tabeli na typ regclass
:
SELECT 'public.actor'::regclass
Wynik:
actor
Jeśli jednak tabela nie istnieje, pojawia się błąd.
Sprawdź, czy tabela już istnieje przed jej utworzeniem
Jeśli potrzebujesz utworzyć tabelę, jeśli nie istnieje, możesz użyć IF NOT EXISTS
klauzula CREATE TABLE
oświadczenie. Jeśli tabela nie istnieje, zostanie utworzona. Jeśli już istnieje, nie zostanie utworzony.
Zobacz Tworzenie tabeli tylko wtedy, gdy nie istnieje w PostgreSQL jako przykład.