Di seguito sono riportati cinque modi per verificare se esiste una tabella in un database PostgreSQL.
Le pg_tables
Visualizza
Le pg_tables
view contiene informazioni su ciascuna tabella nel database.
Possiamo usarlo per verificare se una determinata tabella esiste nel database corrente:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Risultato:
True
In questo caso ottengo True
, il che significa che la tabella esiste (e ho accesso ad essa).
A seconda della tua configurazione, potresti ricevere t
/f
invece di True
/False
.
Il information_schema.tables
Visualizza
Il information_schema.tables
view contiene tutte le tabelle e le viste definite nel database corrente a cui l'utente corrente ha accesso.
Possiamo usarlo per verificare se una determinata tabella esiste e se abbiamo accesso ad essa:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Risultato:
True
Un altro modo per farlo sarebbe ottenere il conteggio:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Risultato:
1
Il table_type
può essere uno dei seguenti:
BASE TABLE | Tabella di base persistente (tabella normale) |
VIEW | Visualizza |
FOREIGN | Tavolo estero |
LOCAL TEMPORARY | Tabella temporanea |
Puoi omettere table_type
dal filtro se vuoi verificare se il nome esiste in tutti i tipi.
Cataloghi di sistema
I cataloghi di sistema sono il luogo in cui un RDBMS archivia i metadati dello schema, come informazioni su tabelle e colonne e informazioni sulla contabilità interna.
In Postgres, i cataloghi di sistema sono tabelle regolari.
Possiamo usarne due per verificare se esiste una determinata tabella:
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'
);
Risultato:
True
Il relkind
di r
è per tavola ordinaria .
Puoi rimuovere il relkind
filtra del tutto se vuoi semplicemente verificare se un oggetto ha già o meno il nome che vuoi dare a una tabella.
Oppure puoi filtrare per altri tipi.
Ecco le opzioni:
r | tavola ordinaria |
i | indice |
S | sequenza |
t | Tabella TOAST |
v | visualizza |
m | vista materializzata |
c | tipo composito |
f | tabella straniera |
p | tabella partizionata |
I | indice partizionato |
Il to_regclass()
Funzione
Il to_regclass()
La funzione converte il nome di una relazione testuale nel suo OID. Se il nome esiste, viene restituito l'OID.
Esempio:
SELECT to_regclass('public.actor');
Risultato:
actor
Se la tabella non esiste, viene restituito NULL.
Trasmetti su regclass
È anche possibile eseguire il cast del nome della tabella per digitare regclass
:
SELECT 'public.actor'::regclass
Risultato:
actor
Tuttavia, se la tabella non esiste, si verifica un errore.
Verifica se una tabella esiste già prima di crearla
Se devi creare la tabella se non esiste, puoi utilizzare il IF NOT EXISTS
clausola del CREATE TABLE
dichiarazione. Se la tabella non esiste, verrà creata. Se esiste già, non verrà creato.
Vedi Creare una tabella solo se non esiste in PostgreSQL per un esempio.