PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

5 modi per verificare se esiste una tabella in PostgreSQL

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.