I just learnt a better way to check if a PostgreSQL table exists. Before I did this to find out if table mytable
is defined:
SELECT * FROM 'mytable' LIMIT 1;
But this had to be wrapped in exception catching application code because I was able to tell if the table existed if the select statement worked. That's the wrong and naive way. The correct way is to use pg_class
and look at how many rows were returned:
SELECT relname FROM pg_class
WHERE relname = 'mytable';
Why have I missed this before? No explanation?
A disadvantage with using pg_class
is that it's not ISO standard, meaning that it's specific to PostgreSQL only. The first pattern will work on all relational databases.
Comments
In psql do "\set ECHO_HIDDEN t" and you can see all the queries it uses for the special backslash commands (like \d)
For functionality similar to mysql SHOW TABLES use: select * from information_schema.tables where table_schema='public' and table_type='BASE TABLE' .
btw. there's a problem with temporary tables, cause they might not be visible (even though they exist). it's better to use:
SELECT 1 FROM pg_catalog.pg_class WHERE relkind = 'r' AND relname = 'name' AND pg_catalog.pg_table_is_visible(oid) LIMIT 1
Thanks!