Users

Create a user:

(postgres@host)_$: createuser -P <user>
pass -> a
superuser -> y

User will be superuser:

(postgres@host)_$: psql -c "ALTER ROLE <user> WITH SUPERUSER;"

User will not be superuser:

(postgres@host)_$: psql -c "ALTER ROLE <user> WITH NOSUPERUSER;"

User with all privileges on a database:

(postgres@host)_$: psql -c "GRANT ALL PRIVILEGES ON DATABASE <database> to <user>;"

List users:

(postgres@host)_$: psql -c "\du"

Change user’s password:

(postgres@host)_$: psql -c "ALTER ROLE <user> WITH PASSWORD 'p455w0rd';"

Delete user:

(postgres@host)_$: dropuser -i <user>
(postgres@host)_$: psql -c "DROP USER <user>;"

User owner of a database:

(postgres@host)_$: psql database-devel
database-devel=#  SELECT d.datname as "Name",pg_catalog.pg_get_userbyid(d.datdba) as "Owner"
FROM pg_catalog.pg_database d
WHERE d.datname = 'database-devel'
ORDER BY 1;

List roles:

(postgres@host)_$: psql database-devel
database-devel=#  SELECT rolname FROM pg_roles;
 rolname
----------
 postgres
 myrole

Databases

Create a database:

(postgres@host)_$: createdb -O <user> <database>

Connect to a database:

(postgres@host)_$: psql <database> -U <user>

Delete a database:

(postgres@host)_$: dropdb -i '<database>'

List all databases:

(postgres@host)_$: psql --list
(postgres@host)_$: psql -c "\l"
(postgres@host)_$: psql -c "\list"

Get the database’s OID:

(postgres@host)_$: psql -c "SELECT datname,oid FROM pg_database;"
(postgres@host)_$: psql -c "SELECT oid FROM pg_database WHERE datname = 'database';"

Rename a database:

(postgres@host)_$: psql -c "ALTER DATABASE oldname RENAME TO newname;"

Database creation time: (It works so long as we don’t change versions)

(postgres@host)_$: ls -la ./9.1/main/base/<OID>/PG_VERSION

Number of tables in the database:

(postgres@host)_$: psql -c "SELECT COUNT(*) FROM pg_stat_user_tables ;" database
(postgres@host)_$: psql -c "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';" database

Tables

Describe tables:

(postgres@host)_$: psql database-devel
database-devel=# \dt          -- All tables
database-devel=# \ds          -- All sequences
database-devel=# \d table     -- Basic information
database-devel=# \d+ table    -- Advanced information

Owner of a table:

(postgres@host)_$: SELECT relname, relowner FROM pg_class WHERE relname LIKE '%cardbin%';

Change the owner of a table:

(postgres@host)_$: psql -c "ALTER TABLE cardbin OWNER TO <user>;"

Number of rows per table:

database-devel=# SELECT schemaname,relname,n_live_tup
  FROM pg_stat_user_tables
  ORDER BY n_live_tup DESC;

Hard disk size

Hard disk size of a database:

(postgres@host)_$: psql
postgres=# SELECT pg_database_size('database-devel') AS bytes;
  bytes
----------
 80118584
(1 row)

That size should be close to the one we get with du:

_$: cd /var/lib/postgresql/9.1/main/base
_$: du 247897/ -cb | grep total
80139064	total

Hard disk size of a table:

(postgres@host)_$: psql database-devel
database-devel=# SELECT pg_table_size('ip') AS bytes;
  bytes
----------
 19144704
(1 row)

Edit columns

Editing columns from pgAdmin might hang if there are more active connections at that time. But we can edit them from the command line:

(postgres@host)_$: psql database-devel
database-devel=# ALTER TABLE crmgrouplang RENAME COLUMN groupid TO crmgroupid;
database-devel=# ALTER TABLE crmgrouplang DROP COLUMN crmgroupid;

database-devel=# ALTER TABLE clientprodescription ALTER COLUMN translation TYPE text;
database-devel=# ALTER TABLE list ALTER COLUMN lat TYPE double precision USING NULLIF(lat, '')::double precision;
database-devel=# ALTER TABLE list ALTER COLUMN lon TYPE double precision USING NULLIF(lon, '')::double precision;

database-devel=# ALTER TABLE web DROP CONSTRAINT web_countrycod_fkey;
database-devel=# ALTER TABLE web DROP COLUMN countrycod;

database-devel=# ALTER TABLE page ADD COLUMN typecs varchar(1) NOT NULL DEFAULT 'b';
database-devel=# ALTER TABLE page ALTER COLUMN typecs DROP DEFAULT;

database-devel=# ALTER TABLE listlead ADD COLUMN ismailed boolean NOT NULL DEFAULT False;

database-devel=# ALTER TABLE crmsupporttype ALTER COLUMN useraddid SET  NOT NULL;
database-devel=# ALTER TABLE crmsupporttype ALTER COLUMN useraddid DROP NOT NULL;

Edit tables

(postgres@host)_$: psql database-devel
database-devel=# ALTER TABLE listconditionhist RENAME TO liststatehist;
database-devel=# DROP TABLE oldclientpro;

Edit sequences, indices, foreign keys and primary keys

Sequences

database-devel=# SELECT relname FROM pg_class WHERE relkind='S' ORDER BY relname;
database-devel=# ALTER SEQUENCE listconditionhist_id_seq RENAME TO liststatehist_id_seq;

database-devel=# SELECT last_value FROM user_id_seq;
database-devel=# SELECT pg_catalog.setval('user_id_seq', (SELECT max(id) FROM "user"));
database-devel=# SELECT pg_catalog.setval('user_id_seq', 23, false);    -- next id == 23
database-devel=# SELECT pg_catalog.setval('client_id_seq', (SELECT max(id) FROM client));

Indices

database-devel=# SELECT * FROM pg_indexes WHERE indexname='client_pkey';
database-devel=# SELECT * FROM pg_indexes WHERE tablename='client';
database-devel=# ALTER INDEX listconditionhist_pkey RENAME TO liststatehist_pkey;
database-devel=# DROP  INDEX clientpro_pkey;
database-devel=# CREATE UNIQUE INDEX clientpro_pkey ON clientpro (id);
database-devel=# CREATE INDEX list_priceforsale_asc ON list (proceforsale ASC);
database-devel=# REINDEX INDEX client_pkey;
database-devel=# REINDEX TABLE client;
database-devel=# REINDEX DATABASE "database-devel";

Foreign keys

-- PostgreSQL <= 9.1
database-devel=# ALTER TABLE liststatehist DROP CONSTRAINT listconditionhist_listid_fkey;
database-devel=# ALTER TABLE liststatehist ADD  CONSTRAINT liststatehist_listid_fkey FOREIGN KEY (listid) REFERENCES list(id);
-- PostgreSQL >= 9.2
database-devel=# ALTER TABLE liststatehist RENAME CONSTRAINT listconditionhist_listid_fkey TO liststatehist_listid_fkey

Primary keys

a) With implicit index:

database-devel=# ALTER TABLE clientpro ADD PRIMARY KEY (id) ;

b) With explicit index:

database-devel=# CREATE UNIQUE INDEX clientpro_pkey ON clientpro (id)
database-devel=# ALTER TABLE clientpro ADD PRIMARY KEY USING INDEX clientpro_pkey ;
```sql


## Edit the owner of a table or sequence

```sql
database-devel=# ALTER TABLE <tablename> OWNER TO <username>;
database-devel=# ALTER SEQUENCE <sequencename> OWNER TO <username>;
```sql


## Check the columns order

```sql
(postgres@host)_$: psql database-devel
database-devel=# SELECT attrelid, attname, attnum FROM pg_attribute WHERE attname='datelast';
 attrelid | attname  | attnum
----------+----------+--------
    65010 | datelast |     11
    65193 | datelast |     34
    65437 | datelast |      9

database-devel=# SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=65193;
 attrelid |      attname       | attnum
----------+--------------------+--------
    65193 | tableoid           |     -7
    65193 | cmax               |     -6
    65193 | xmax               |     -5
    65193 | cmin               |     -4
    65193 | xmin               |     -3
    65193 | ctid               |     -1
    65193 | id                 |      1
    65193 | webid              |      2
    65193 | clientid           |      3
    65193 | isactive           |      4
    65193 | istop              |      5
    65193 | typecs             |      6
    65193 | statecs            |      7
    65193 | refinternal        |      8
    65193 | refclient          |      9
    65193 | loc1countrycod     |     10
    65193 | loc2zoneid         |     11
    65193 | loc3townid         |     12
    65193 | loc4districtid     |     13
    65193 | loc5neighborhoodid |     14
    65193 | address            |     15
    65193 | postalcod          |     16
    65193 | ishidden           |     17
    65193 | typelisthiddencod  |     18
    65193 | geo1               |     19
    65193 | geo2               |     20
    65193 | isgeoauto          |     21