Nedan finns fem sätt att kontrollera om en tabell finns i en PostgreSQL-databas.
pg_tables
Visa
pg_tables
vyn innehåller information om varje tabell i databasen.
Vi kan använda den för att kontrollera om en given tabell finns i den aktuella databasen:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Resultat:
True
I det här fallet får jag True
, vilket betyder att tabellen existerar (och jag har tillgång till den).
Beroende på din konfiguration kan du få t
/f
istället för True
/False
.
information_schema.tables
Visa
information_schema.tables
vyn innehåller alla tabeller och vyer definierade i den aktuella databasen som den aktuella användaren har tillgång till.
Vi kan använda den för att kontrollera om en given tabell finns och att vi har tillgång till 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
Ett annat sätt att göra det skulle vara att få räkningen:
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 vara något av följande:
BASE TABLE | Beständig bastabell (normal tabell) |
VIEW | Visa |
FOREIGN | Utländsk tabell |
LOCAL TEMPORARY | Tillfällig tabell |
Du kan utelämna table_type
från ditt filter om du vill kontrollera om namnet finns för alla typer.
Systemkataloger
Systemkatalogerna är platsen där en RDBMS lagrar schemametadata, såsom information om tabeller och kolumner, och intern bokföringsinformation.
I Postgres är systemkataloger vanliga tabeller.
Vi kan använda två av dem för att kontrollera om en given tabell finns:
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
av r
är för vanligt bord .
Du kan ta bort relkind
filtrera helt om du bara vill kontrollera om ett objekt redan har det namn som du vill ge till en tabell eller inte.
Eller så kan du filtrera efter andra typer.
Här är alternativen:
r | vanligt bord |
i | index |
S | sekvens |
t | TOAST-bord |
v | vy |
m | materialiserad vy |
c | sammansatt typ |
f | utländsk tabell |
p | partitionerad tabell |
I | partitionerat index |
to_regclass()
Funktion
to_regclass()
funktion översätter ett textrelationsnamn till dess OID. Om namnet finns returneras OID.
Exempel:
SELECT to_regclass('public.actor');
Resultat:
actor
Om tabellen inte finns returneras NULL.
Casta till regclass
Det är också möjligt att casta tabellnamnet till typ regclass
:
SELECT 'public.actor'::regclass
Resultat:
actor
Men om tabellen inte finns, uppstår ett fel.
Kontrollera om en tabell redan finns innan du skapar den
Om du behöver skapa tabellen om den inte finns kan du använda IF NOT EXISTS
satsen i CREATE TABLE
påstående. Om tabellen inte finns skapas den. Om den redan finns skapas den inte.
Se Skapa en tabell endast om den inte finns i PostgreSQL för ett exempel.