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.