Table of Contents

Postgresql

General

Add pgplsql support

 % createlang plpgsql template1

Adding a column to a table

 alter table pfo_survey_response_2006 add column section text

Backing up a database

 % pg_dump databasename > db.out

Connecting to a user / database
Say you have your primary database user as 'nsadmin', and they have a database called 'openacs'. If you're using the default pg_hba.conf , you can connect to the database, logged in as an ordinary person, by doing

 % psql -U nsadmin opeancs

Creating a new database

 % createdb database-name

Creating a new user

 psql=# create user bork with password 'bork';

You can also do this for a passwordless user: % crateuser bork

Creating a new user

 createuser -P <username>

creating a new database

 createdb -O <owner> <database_name>

changing postgsql user password

as postgres user (su - postgres) do:

$ psql template1

   Welcome to psql 7.3.4, the PostgreSQL interactive terminal.

   Type:  \copyright for distribution terms
          \h for help with SQL commands
          \? for help on internal slash commands
          \g or terminate with semicolon to execute query
          \q to quit

template1=# ALTER USER <username> WITH ENCRYPTED PASSWORD '<newpassword>';

changeing ownership of database

 UPDATE pg_database SET datdba=(SELECT usesysid FROM pg_shadow WHERE usename='<username>') WHERE datname='<dbname>';

Inserting a time column
If you have the minutes, seconds, and am/pm and want to get them into a time column (time without timezone), you can do something like this:

  psql=# select to_timestamp('10:45am', 'HH12:MIam')::timetz::time;
  to_timestamp
 --------------
  10:45:00
  (1 row)

Limiting selections to X number of rows

 use the "limit" statement:
 select stuff from some_table
   where stuff.blah > 12
  limit 5

Logging in as a specific user

  % psql database-name user-name

Logging into a remote database
On machine tower, dbname borkdb, user nettest

 % psql -h tower borkdb nettest

Manually starting the database

  % pg_ctl -D /usr/local/pgsql/data -l /tmp/pgsql.log start

Next value from a sequence

 insert into blah (id, stuff) 
        values (nextval('sequence_name'), 'stuff');

Restoring a Database

 % psql -d databasename -f db.out

Seeing available databases

 % psql -l
  (lower case Ell)

Selecting a random row from a table
use the random() function.

     select stuff.src, stuff.width, stuff.height from
          (select src, width, height,
                 random()
             from bw_eyes
           order by 4) stuff
      limit 1

This selects a random row from bw_eyes and returns the interesting data from it. This query is used on the quickies pages to randomly select an image of eyes staring back.

Time interval math to integer If you take the difference between two timestamps, you can end up with an unweildly value like “00:06:14.37086 days old”. You can cast the timestamps into just regular dates like:

 select current_timestamp()::date - entry_date::date as days_old from kb_nuggets;

Turning off the psql pager

 wplug-oacs=# \pset pager

Pager usage is off.

pg interval math Older versions of pg would support select blah from whatever where date-column > (current_timestamp - 21) to get all the blahs from whatever in the last 21 days. This doesn't work in newer versions of Postgresql. Instead, you need to use a time interval:

 select to_char (whenx, 'fmDD fmMonth YYYY') as pretty_when, text
   from blog
  where whenx > (current_timestamp - interval '21 days')
  order by whenx desc

terminate a query which is taking a long time to run

 SELECT procpid, current_query, query_start
 FROM pg_stat_activity;
 kill -INT procpid

PostgreSQL Check Constraint Supports Regular Expressions

 CREATE TABLE example_table (
      first_name VARCHAR(100)
          CONSTRAINT check_first_name
         ( first_name ~* '^[a-z]+$')
 );

see: this