sql >> Database >  >> RDS >> PostgreSQL

5 manieren om te controleren of een tabel bestaat in PostgreSQL

Hieronder staan ​​vijf manieren om te controleren of een tabel bestaat in een PostgreSQL-database.

De pg_tables Bekijk

De pg_tables view bevat informatie over elke tabel in de database.

We kunnen het gebruiken om te controleren of een bepaalde tabel in de huidige database bestaat:

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

Resultaat:

True

In dit geval krijg ik True , wat betekent dat de tabel bestaat (en ik heb er toegang toe).

Afhankelijk van uw configuratie krijgt u mogelijk t /f in plaats van True /False .

De information_schema.tables Bekijk

De information_schema.tables view bevat alle tabellen en views die zijn gedefinieerd in de huidige database waartoe de huidige gebruiker toegang heeft.

We kunnen het gebruiken om te controleren of een bepaalde tabel bestaat en of we er toegang toe hebben:

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

Resultaat:

True

Een andere manier om dit te doen zou zijn om de telling te krijgen:

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

Resultaat:

1

De table_type kan een van de volgende zijn:

BASE TABLE Persistente basistabel (normale tabel)
VIEW Bekijken
FOREIGN Buitenlandse tafel
LOCAL TEMPORARY Tijdelijke tafel

U kunt table_type weglaten uit uw filter als u wilt controleren of de naam in alle typen voorkomt.

Systeemcatalogi

De systeemcatalogi zijn de plaats waar een RDBMS schemametadata opslaat, zoals informatie over tabellen en kolommen, en interne boekhoudinformatie.

In Postgres zijn systeemcatalogi gewone tabellen.

We kunnen er twee gebruiken om te controleren of een bepaalde tabel bestaat:

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'
    );

Resultaat:

True

De relkind van r is voor gewone tafel .

U kunt de relkind . verwijderen filter helemaal als u gewoon wilt controleren of een object al de naam heeft die u aan een tabel wilt geven.

Of u kunt filteren op andere typen.

Dit zijn de opties:

r gewone tafel
i index
S reeks
t TOAST-tabel
v bekijken
m gematerialiseerde weergave
c composiettype
f buitenlandse tafel
p gepartitioneerde tabel
I gepartitioneerde index

De to_regclass() Functie

De to_regclass() functie vertaalt een tekstuele relatienaam naar zijn OID. Als de naam bestaat, wordt de OID geretourneerd.

Voorbeeld:

SELECT to_regclass('public.actor');

Resultaat:

actor

Als de tabel niet bestaat, wordt NULL geretourneerd.

Cast naar regclass

Het is ook mogelijk om de tabelnaam te casten naar regclass :

SELECT 'public.actor'::regclass

Resultaat:

actor

Als de tabel echter niet bestaat, treedt er een fout op.

Controleer of een tabel al bestaat voordat u deze maakt

Als u de tabel moet maken als deze niet bestaat, kunt u de IF NOT EXISTS gebruiken clausule van de CREATE TABLE uitspraak. Als de tabel niet bestaat, wordt deze gemaakt. Als het al bestaat, wordt het niet gemaakt.

Zie Alleen een tabel maken als deze niet in PostgreSQL bestaat voor een voorbeeld.


  1. Is er een Booleaans gegevenstype in Microsoft SQL Server zoals in MySQL?

  2. Veldtypen en gebruik in Access 2019-databases

  3. Hoe te bestellen op maandnaam in PostgreSQL of Oracle

  4. Hoe SQLite Max() werkt