Níže je pět způsobů, jak zkontrolovat, zda tabulka existuje v databázi PostgreSQL.
pg_tables
Zobrazit
pg_tables
zobrazení obsahuje informace o každé tabulce v databázi.
Můžeme jej použít ke kontrole, zda daná tabulka existuje v aktuální databázi:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Výsledek:
True
V tomto případě dostávám True
, což znamená, že tabulka existuje (a mám k ní přístup).
V závislosti na vaší konfiguraci můžete získat t
/f
místo True
/False
.
information_schema.tables
Zobrazit
information_schema.tables
view obsahuje všechny tabulky a pohledy definované v aktuální databázi, ke kterým má aktuální uživatel přístup.
Můžeme jej použít ke kontrole, zda daná tabulka existuje a že k ní máme přístup:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Výsledek:
True
Dalším způsobem, jak to udělat, by bylo získat počet:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Výsledek:
1
table_type
může být jedna z následujících:
BASE TABLE | Trvalá základní tabulka (normální tabulka) |
VIEW | Zobrazit |
FOREIGN | Zahraniční tabulka |
LOCAL TEMPORARY | Dočasný stůl |
table_type
můžete vynechat z vašeho filtru, pokud chcete zkontrolovat, zda název existuje u všech typů.
Systémové katalogy
Systémové katalogy jsou místem, kde RDBMS ukládá metadata schémat, jako jsou informace o tabulkách a sloupcích a informace o interním účetnictví.
V Postgresu jsou systémové katalogy běžné tabulky.
Můžeme použít dva z nich ke kontrole, zda daná tabulka existuje:
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'
);
Výsledek:
True
relkind
z r
je pro běžný stůl .
Můžete odstranit relkind
filtr úplně, pokud chcete jednoduše zkontrolovat, zda objekt již má název, který chcete dát tabulce.
Nebo můžete filtrovat podle jiných typů.
Zde jsou možnosti:
r | běžná tabulka |
i | index |
S | sekvence |
t | Tabulka TOAST |
v | zobrazit |
m | materializované zobrazení |
c | složený typ |
f | cizí tabulka |
p | rozdělená tabulka |
I | rozdělený index |
to_regclass()
Funkce
to_regclass()
funkce přeloží název textového vztahu na jeho OID. Pokud název existuje, vrátí se OID.
Příklad:
SELECT to_regclass('public.actor');
Výsledek:
actor
Pokud tabulka neexistuje, vrátí se NULL.
Odesílání do regclass
Je také možné přetypovat název tabulky na typ regclass
:
SELECT 'public.actor'::regclass
Výsledek:
actor
Pokud však tabulka neexistuje, dojde k chybě.
Před jejím vytvořením zkontrolujte, zda tabulka již existuje
Pokud potřebujete vytvořit tabulku, pokud neexistuje, můžete použít IF NOT EXISTS
klauzule CREATE TABLE
prohlášení. Pokud tabulka neexistuje, bude vytvořena. Pokud již existuje, nebude vytvořen.
Příklad viz Vytvoření tabulky pouze v případě, že v PostgreSQL neexistuje.