sql >> Base de Datos >  >> RDS >> PostgreSQL

5 formas de comprobar si existe una tabla en PostgreSQL

A continuación se muestran cinco formas de comprobar si existe una tabla en una base de datos PostgreSQL.

Las pg_tables Ver

Las pg_tables view contiene información sobre cada tabla en la base de datos.

Podemos usarlo para verificar si una tabla dada existe en la base de datos actual:

SELECT EXISTS (
    SELECT FROM 
        pg_tables
    WHERE 
        schemaname = 'public' AND 
        tablename  = 'actor'
    );

Resultado:

True

En este caso obtengo True , lo que significa que la tabla existe (y tengo acceso a ella).

Dependiendo de su configuración, puede obtener t /f en lugar de True /False .

El information_schema.tables Ver

El information_schema.tables view contiene todas las tablas y vistas definidas en la base de datos actual a la que tiene acceso el usuario actual.

Podemos usarlo para comprobar si existe una tabla dada y que tenemos acceso a ella:

SELECT EXISTS (
    SELECT FROM 
        information_schema.tables 
    WHERE 
        table_schema LIKE 'public' AND 
        table_type LIKE 'BASE TABLE' AND
        table_name = 'actor'
    );

Resultado:

True

Otra forma de hacerlo sería obtener el conteo:

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

El table_type puede ser uno de los siguientes:

BASE TABLE Tabla base persistente (tabla normal)
VIEW Ver
FOREIGN Tabla extranjera
LOCAL TEMPORARY Mesa temporal

Puede omitir table_type de su filtro si desea verificar si el nombre existe en todos los tipos.

Catálogos del sistema

Los catálogos del sistema son el lugar donde un RDBMS almacena los metadatos del esquema, como información sobre tablas y columnas, e información de contabilidad interna.

En Postgres, los catálogos del sistema son tablas normales.

Podemos usar dos de ellos para verificar si existe una tabla dada:

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

El relkind de r es para mesa ordinaria .

Puede eliminar el relkind filtre por completo si simplemente desea verificar si un objeto ya tiene o no el nombre que desea dar a una tabla.

O puede filtrar por otros tipos.

Estas son las opciones:

r tabla ordinaria
i índice
S secuencia
t mesa TOSTADAS
v ver
m vista materializada
c tipo compuesto
f tabla extranjera
p tabla particionada
I índice particionado

El to_regclass() Función

El to_regclass() La función traduce un nombre de relación textual a su OID. Si el nombre existe, se devuelve el OID.

Ejemplo:

SELECT to_regclass('public.actor');

Resultado:

actor

Si la tabla no existe, se devuelve NULL.

Transmitir a regclass

También es posible convertir el nombre de la tabla para escribir regclass :

SELECT 'public.actor'::regclass

Resultado:

actor

Sin embargo, si la tabla no existe, se produce un error.

Comprobar si una tabla ya existe antes de crearla

Si necesita crear la tabla si no existe, puede usar IF NOT EXISTS cláusula de CREATE TABLE declaración. Si la tabla no existe, se creará. Si ya existe, no se creará.

Consulte Crear una tabla solo si no existe en PostgreSQL para ver un ejemplo.