PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

5 maneiras de verificar se existe uma tabela no PostgreSQL


Abaixo estão cinco maneiras de verificar se existe uma tabela em um banco de dados PostgreSQL.

As pg_tables Visualizar


As pg_tables view contém informações sobre cada tabela no banco de dados.

Podemos usá-lo para verificar se uma determinada tabela existe no banco de dados atual:
SELECT EXISTS (
    SELECT FROM 
        pg_tables
    WHERE 
        schemaname = 'public' AND 
        tablename  = 'actor'
    );

Resultado:
True

Neste caso, recebo True , o que significa que a tabela existe (e eu tenho acesso a ela).

Dependendo da sua configuração, você pode obter t /f em vez de True /False .

As information_schema.tables Visualizar


O information_schema.tables view contém todas as tabelas e visualizações definidas no banco de dados atual que o usuário atual tem acesso.

Podemos usá-lo para verificar se uma determinada tabela existe e se temos acesso a ela:
SELECT EXISTS (
    SELECT FROM 
        information_schema.tables 
    WHERE 
        table_schema LIKE 'public' AND 
        table_type LIKE 'BASE TABLE' AND
        table_name = 'actor'
    );

Resultado:
True

Outra maneira de fazer isso seria obter a contagem:
SELECT 
    COUNT(table_name)
FROM 
    information_schema.tables 
WHERE 
    table_schema LIKE 'public' AND 
    table_type LIKE 'BASE TABLE' AND
	table_name = 'actor';

Resultado:
1

O table_type pode ser um dos seguintes:
BASE TABLE Tabela base persistente (tabela normal)
VIEW Visualizar
FOREIGN Tabela estrangeira
LOCAL TEMPORARY Tabela temporária

Você pode omitir table_type do seu filtro se quiser verificar se o nome existe em todos os tipos.

Catálogos do sistema


Os catálogos do sistema são o local onde um RDBMS armazena metadados de esquema, como informações sobre tabelas e colunas e informações de contabilidade interna.

No Postgres, os catálogos do sistema são tabelas regulares.

Podemos usar dois deles para verificar se uma determinada tabela existe:
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'
    );

Resultado:
True

O relkind de r é para tabela comum .

Você pode remover o relkind filter completamente se você quiser simplesmente verificar se um objeto já tem ou não o nome que você deseja dar a uma tabela.

Ou você pode filtrar por outros tipos.

Aqui estão as opções:
r tabela comum
i índice
S sequência
t Tabela TOAST
v visualizar
m visualização materializada
c tipo composto
f tabela estrangeira
p tabela particionada
I índice particionado

O to_regclass() Função


O to_regclass() A função traduz um nome de relação textual para seu OID. Se o nome existir, o OID será retornado.

Exemplo:
SELECT to_regclass('public.actor');

Resultado:
actor

Se a tabela não existir, NULL será retornado.

Transmitir para regclass


Também é possível converter o nome da tabela para digitar regclass :
SELECT 'public.actor'::regclass

Resultado:
actor

No entanto, se a tabela não existir, ocorrerá um erro.

Verifique se já existe uma tabela antes de criá-la


Se você precisar criar a tabela se ela não existir, você pode usar o IF NOT EXISTS cláusula do CREATE TABLE demonstração. Se a tabela não existir, ela será criada. Se já existir, não será criado.

Consulte Criar uma tabela somente se ela não existir no PostgreSQL para obter um exemplo.