psql: A few useful commands or queries
The things you must know
This section is for every command/instruction you should know when using PostgreSQL’s psql!
On almost every command you can add an S
to also show system objects and a +
to show more information!
Database
\l
List all databases\c databasename
Connect todatabasename
database
Tables/Relations/Views
\d
List all tables, views and sequences\d tablename
Show the definition fortablename
table\dt
List tables only\dv
List views only\ds
List sequences only\dp
List permissions for tables, views and sequences
Users
\du
List all users
Day to day tasks
Some queries for day-to-day tasks using a PostgreSQL server.
Create a new user with a password
create user myuser with password 'very-secure-password';
Create a database for user (which is database owner)
create database newdatabase with owner myuser;
Show stats like table sizes, row count and index size
SELECT t.tablename,
foo.indexname,
c.reltuples AS num_rows,
pg_size_pretty(pg_relation_size(quote_ident(t.tablename::text)::regclass)) AS table_size,
pg_size_pretty(pg_total_relation_size(s.relid::regclass)) AS table_total_size,
pg_size_pretty(pg_total_relation_size(s.relid::regclass) - pg_relation_size(s.relid::regclass)) AS table_external_size,
pg_size_pretty(pg_relation_size(quote_ident(foo.indexrelname::text)::regclass)) AS index_size,
CASE
WHEN foo.indisunique THEN 'Y'::text
ELSE 'N'::text
END AS "index_unique",
foo.idx_scan AS number_of_scans,
foo.idx_tup_read AS tuples_read,
foo.idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT JOIN pg_class c ON t.tablename = c.relname
LEFT JOIN pg_statio_user_tables s ON s.relname = t.tablename
LEFT JOIN ( SELECT c_1.relname AS ctablename,
ipg.relname AS indexname,
x.indnatts AS number_of_columns,
psai.idx_scan,
psai.idx_tup_read,
psai.idx_tup_fetch,
psai.indexrelname,
x.indisunique
FROM pg_index x
JOIN pg_class c_1 ON c_1.oid = x.indrelid
JOIN pg_class ipg ON ipg.oid = x.indexrelid
JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid) foo ON t.tablename = foo.ctablename
WHERE t.schemaname = 'public'::name
ORDER BY t.tablename, foo.indexname
Change Owner for Tables/Functions/Sequences
With these SQL statements you’ll only generate SQL to update the owner on these objects. You’ll have to execute the generated SQL afterwards. In the examples, the public schema is used, change it to your need.
Tables
select 'ALTER TABLE '|| tablename ||' OWNER TO {newOwner};' FROM pg_tables WHERE schemaname = 'public';
Functions
SELECT 'ALTER FUNCTION '
|| quote_ident(n.nspname) || '.'
|| quote_ident(p.proname) || '('
|| pg_catalog.pg_get_function_identity_arguments(p.oid)
|| ') OWNER TO {newOwner};'
, E'\n' AS _sql
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
Sequences
SELECT 'ALTER SEQUENCE '
|| quote_ident(n.nspname) || '.'
|| quote_ident(c.relname)
|| ' OWNER TO {newOwner};'
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relkind = 'S';