Postgresql PDF
Postgresql PDF
#postgresql
Table of Contents
About 1
Remarks 2
Versions 2
Examples 2
Installation on GNU+Linux 2
Debian family 3
Examples 10
Sample program 11
Examples 16
string_agg(expression, delimiter) 16
Remarks 19
Examples 19
Backing up one database 19
Restoring backups 19
Syntax 23
Parameters 23
Remarks 23
Examples 24
saveProdDb.sh 24
Chapter 6: COALESCE 25
Introduction 25
Examples 25
Introduction 26
Syntax 26
Remarks 26
Examples 26
COMMENT on Table 26
Remove Comment 26
Examples 27
Introduction 29
Remarks 29
Examples 30
Introduction 33
Examples 33
Numeric Types 33
Geometric Types 35
Character Types 35
Arrays 35
Declaring an Array 35
Creating an Array 36
Accessing an Array 36
Array functions 37
Examples 38
Remarks 39
Examples 39
Chapter 13: Export PostgreSQL database table header and data to CSV file 40
Introduction 40
Examples 40
Syntax 41
Examples 41
Extention dblink 41
Extention FDW 41
Introduction 44
Examples 44
Remarks 45
Examples 45
users 45
simple_users 45
users_with_password 45
Altering tables 46
Adding columns 46
simple_users 46
Dropping columns 46
users 46
simple_users 47
Examples 48
Basic INSERT 48
Introduction 52
Examples 52
Populating the DB 54
-> vs ->> 55
Filtering 55
Nested filtering 56
Introduction 59
Examples 59
digest 59
Chapter 20: Postgres Tip and Tricks 60
Examples 60
Update query with join between two tables alternative since Postresql does not support joi 60
Difference between two date timestamps month wise and year wise 60
Query to Copy/Move/Transafer table data from one database to other database table with sam 61
Examples 62
Replication in PostgreSQL 62
Remarks 65
Examples 65
PL/pgSQL Syntax 66
RETURNS Block 66
custom exceptions 66
Introduction 68
Examples 68
Sum of Integers 68
Syntax 69
Examples 69
Examples 74
Introduction 76
Remarks 76
Examples 76
Type of triggers 77
Step 3: test it 78
Step 3: test it 79
Examples 80
Examples 81
generic example 81
Credits 83
About
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: postgresql
It is an unofficial and free postgresql ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official postgresql.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/ 1
Chapter 1: Getting started with postgresql
Remarks
This section provides an overview of what postgresql is, and why a developer might want to use it.
It should also mention any large subjects within postgresql, and link out to the related topics. Since
the Documentation for postgresql is new, you may need to create initial versions of those related
topics.
Versions
Examples
Installation on GNU+Linux
On most GNU+Linux operating systems, PostgreSQL can easily be installed using the operating
system package manager.
https://riptutorial.com/ 2
View available packages:
These are installed with the following command: yum -y install postgresqlXX postgresqlXX-server
postgresqlXX-libs postgresqlXX-contrib
Once installed you will need to start the database service as the service owner (Default is
postgres). This is done with the pg_ctl command.
Debian family
On Debian and derived operating systems, type:
This will install the PostgreSQL server package, at the default version offered by the operating
system's package repositories.
If the version that's installed by default is not the one that you want, you can use the package
manager to search for specific versions which may simultaneously be offered.
You can also use the Yum repository provided by the PostgreSQL project (known as PGDG) to
get a different version. This may allow versions not yet offered by operating system package
repositories.
In order to install PostgreSQL on OSX, you need to know which versions are currently supported.
You should get a list that looks something like the following:
https://riptutorial.com/ 3
postgresql84 @8.4.22 databases/postgresql84
postgresql90 @9.0.23 databases/postgresql90
postgresql91 @9.1.22 databases/postgresql91
postgresql92 @9.2.17 databases/postgresql92
postgresql93 @9.3.13 databases/postgresql93
postgresql94 @9.4.8 databases/postgresql94
postgresql95 @9.5.3 databases/postgresql95
postgresql96 @9.6beta2 databases/postgresql96
In this example, the most recent version of PostgreSQL that is supported in 9.6, so we will install
that.
The log provides instructions on the rest of the steps for installation, so we do that next.
https://riptutorial.com/ 4
Now we start the server:
su postgres -c psql
psql (9.6.1)
Type "help" for help.
postgres=#
Here you can type a query to see that the server is running.
setting
------------------------------------------
/opt/local/var/db/postgresql96/defaultdb
(1 row)
postgres=#
Type \q to quit:
postgres=#\q
While it's good practice to use a Unix based operating system (ex. Linux or BSD) as a production
server you can easily install PostgreSQL on Windows (hopefully only as a development server).
https://riptutorial.com/ 5
started by core contributors to the PostgreSQL project who have optimized the binaries for
Windows.
Select the latest stable (non-Beta) version (9.5.3 at the time of writing). You will most likely want
the Win x86-64 package, but if you are running a 32 bit version of Windows, which is common on
older computers, select Win x86-32 instead.
Note: Switching between Beta and Stable versions will involve complex tasks like dump and
restore. Upgrading within beta or stable version only needs a service restart.
You can check if your version of Windows is 32 or 64 bit by going to Control Panel -> System and
Security -> System -> System type, which will say "##-bit Operating System". This is the path for
Windows 7, it may be slightly different on other versions of Windows.
In the installer select the packages you would like to use. For example:
• pgAdmin ( https://www.pgadmin.org ) is a free GUI for managing your database and I highly
recommend it. In 9.6 this will be installed by default .
• PostGIS ( http://postgis.net ) provides geospatial analysis features on GPS coordinates,
distances etc. very popular among GIS developers.
• The Language Package provides required libraries for officially supported procedural
language PL/Python, PL/Perl and PL/Tcl.
• Other packages like pgAgent, pgBouncer and Slony are useful for larger production servers,
only checked as needed.
All those optional packages can be later installed through "Application Stack Builder".
Note: There are also other non-officially supported language such as PL/V8, PL/Lua PL/Java
available.
Open pgAdmin and connect to your server by double clicking on its name, ex. "PostgreSQL 9.5
(localhost:5432).
From this point you can follow guides such as the excellent book PostgreSQL: Up and Running,
2nd Edition ( http://shop.oreilly.com/product/0636920032144.do ).
PostgreSQL runs as a service in the background which is slightly different than most programs.
This is common for databases and web servers. Its default Startup Type is Automatic which
means it will always run without any input from you.
Why would you want to manually control the PostgreSQL service? If you're using your PC as a
development server some of the time and but also use it to play video games for example,
PostegreSQL could slow down your system a bit while its running.
Why wouldn't you want manual control? Starting and stopping the service can be a hassle if you
do it often.
If you don't notice any difference in speed and prefer avoiding the hassle then leave its Startup
https://riptutorial.com/ 6
Type as Automatic and ignore the rest of this guide. Otherwise...
Select "Services" from the list, right click on its icon, and select Send To -> Desktop to create a
desktop icon for more convenient access.
Close the Administrative Tools window then launch Services from the desktop icon you just
created.
Scroll down until you see a service with a name like postgresql-x##-9.# (ex. "postgresql-x64-9.5").
Right click on the postgres service, select Properties -> Startup type -> Manual -> Apply -> OK.
You can change it back to automatic just as easily.
If you see other PostgreSQL related services in the list such "pgbouncer" or "PostgreSQL
Scheduling Agent - pgAgent" you can also change their Startup Type to Manual because they're
not much use if PostgreSQL isn't running. Although this will mean more hassle each time you start
and stop so it's up to you. They don't use as many resources as PostgreSQL itself and may not
have any noticeable impact on your systems performance.
If the service is running its Status will say Started, otherwise it isn't running.
To start it right click and select Start. A loading prompt will be displayed and should disappear on
its own soon after. If it gives you an error try a second time. If that doesn't work then there was
some problem with the installation, possibly because you changed some setting in Windows most
people don't change, so finding the problem might require some sleuthing.
If you ever get an error while attempting to connect to your database check Services to make sure
its running.
For other very specific details about the EDB PostgreSQL installation, e.g. the python runtime
version in the official language pack of a specific PostgreSQL version, always refer to the official
EBD installation guide , change the version in link to your installer's major version.
Homebrew calls itself 'the missing package manager for macOS'. It can be used to build and
install applications and libraries. Once installed, you can use the brew command to install
PostgreSQL and it's dependencies as follows:
brew update
brew install postgresql
Homebrew generally installs the latest stable version. If you need a different one then brew search
postgresql will list the versions available. If you need PostgreSQL built with particular options then
brew info postgresql will list which options are supported. If you require an unsupported build
https://riptutorial.com/ 7
option, you may have to do the build yourself, but can still use Homebrew to install the common
dependencies.
psql
If psql complains that there's no corresponding database for your user, run createdb.
Dependencies:
There are a large number of different options for the configuration of PostgreSQL:
https://riptutorial.com/ 8
Go into the new created folder and run the cofigure script with the desired options:
./configure --exec=/usr/local/pgsql
For the extension switch the directory cd contrib, run make and make install
https://riptutorial.com/ 9
Chapter 2: Accessing Data Programmatically
Examples
Accessing Postgresql from .NET using the Npgsql provider
One of the more popular .NET providers for Postgresql is Npgsql, which is ADO.NET compatible
and is used nearly identically as other .NET database providers.
A typical query is performed by creating a command, binding parameters, and then executing the
command. In C#:
conn.Open();
// Create a new command with CommandText and Connection constructor
using (var cmd = new NpgsqlCommand(querystring, conn))
{
// Add a parameter and set its type with the NpgsqlDbType enum
var contentString = "Hello World!";
cmd.Parameters.Add("@content", NpgsqlDbType.Text).Value = contentString;
// Execute the command and read through the rows one by one
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read()) // Returns false for 0 rows, or after reading the last row
of the results
{
// read an integer value
int primaryKey = reader.GetInt32(0);
// or
primaryKey = Convert.ToInt32(reader["primary_key"]);
https://riptutorial.com/ 10
} // the C# 'using' directive calls conn.Close() and conn.Dispose() for us
The C-API is the most powerful way to access PostgreSQL and it is surprisingly comfortable.
Note: For historical reason, the library is called libpq.soand not libpg.so, which is a popular trap
for beginners.
Given that the below code sample is in file coltype.c, compilation and linking would be done with
with the GNU C compiler (consider adding -Wl,-rpath,"$(pg_config --libdir)" to add the library
search path) or with
Sample program
/* necessary for all PostgreSQL client programs, should be first */
#include <libpq-fe.h>
#include <stdio.h>
#include <string.h>
#ifdef TRACE
#define TRACEFILE "trace.out"
#endif
https://riptutorial.com/ 11
/* parameter value */
const char * const paramValues[1] = { "pg_database" };
/*
* Using an empty connectstring will use default values for everything.
* If set, the environment variables PGHOST, PGDATABASE, PGPORT and
* PGUSER will be used.
*/
conn = PQconnectdb("");
/*
* This can only happen if there is not enough memory
* to allocate the PGconn structure.
*/
if (conn == NULL)
{
fprintf(stderr, "Out of memory connecting to PostgreSQL.\n");
return 1;
}
#ifdef TRACE
if (NULL == (trc = fopen(TRACEFILE, "w")))
{
fprintf(stderr, "Error opening trace file \"%s\"!\n", TRACEFILE);
PQfinish(conn);
return 1;
}
https://riptutorial.com/ 12
/* out of memory or sever communication broken */
if (NULL == res)
{
fprintf(stderr, "%s\n", PQerrorMessage(conn));
PQfinish(conn);
#ifdef TRACE
fclose(trc);
#endif
return 1;
}
printf(PQfname(res, j));
}
printf("\n\n");
printf(PQgetvalue(res, i, j));
}
printf("\n");
}
https://riptutorial.com/ 13
/* this must be done after every statement to avoid memory leaks */
PQclear(res);
/* close the database connection and release memory */
PQfinish(conn);
#ifdef TRACE
fclose(trc);
#endif
return 0;
}
import psycopg2
db_host = 'postgres.server.com'
db_port = '5432'
db_un = 'user'
db_pw = 'password'
db_name = 'testdb'
print(cur.fetchall())
Will result:
On the shoulders of the low level drivers, there is pomm. It proposes a modular approach, data
converters, listen/notify support, database inspector and much more.
Assuming, Pomm has been installed using composer, here is a complete example:
<?php
use PommProject\Foundation\Pomm;
$loader = require __DIR__ . '/vendor/autoload.php';
$pomm = new Pomm(['my_db' => ['dsn' => 'pgsql://user:pass@host:5432/db_name']]);
// TABLE comment (
// comment_id uuid PK, created_at timestamptz NN,
// is_moderated bool NN default false,
https://riptutorial.com/ 14
// content text NN CHECK (content !~ '^\s+$'), author_email text NN)
$sql = <<<SQL
SELECT
comment_id,
created_at,
is_moderated,
content,
author_email
FROM comment
INNER JOIN author USING (author_email)
WHERE
age(now(), created_at) < $*::interval
ORDER BY created_at ASC
SQL;
if ($comments->isEmpty()) {
printf("There are no new comments since yesterday.");
} else {
foreach ($comments as $comment) {
printf(
"%s has posted at %s. %s\n",
$comment['author_email'],
$comment['created_at']->format("Y-m-d H:i:s"),
$comment['is_moderated'] ? '[OK]' : '');
}
}
Pomm’s query manager module escapes query arguments to prevent SQL injection. When the
arguments are cast, it also converts them from a PHP representation to valid Postgres values. The
result is an iterator, it uses a cursor internally. Every row is converted on the fly, booleans to
booleans, timestamps to \DateTime etc.
https://riptutorial.com/ 15
Chapter 3: Aggregate Functions
Examples
Simple statistics: min(), max(), avg()
In order to determine some simple statistics of a value in a column of a table, you can use an
aggregate function.
Name Age
Allie 17
Amanda 14
Alana 20
You could write this statement to get the minimum, maximum and average value:
Result:
14 20 17
string_agg(expression, delimiter)
You can concatenate strings separated by delimiter using the string_agg() function.
Allie 15 USA
Amanda 14 USA
Alana 20 Russia
You could write SELECT ... GROUP BY statement to get names from each country:
https://riptutorial.com/ 16
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Note that you need to use a GROUP BY clause because string_agg() is an aggregate function.
Result:
names country
Alana Russia
To illustrate how to use regr_slope(Y,X), I applied it to a real world problem. In Java, if you don't
clean up memory properly, the garbage can get stuck and fill up the memory. You dump statistics
every hour about memory utilization of different classes and load it into a postgres database for
analysis.
All memory leak candidates will have a trend of consuming more memory as more time passes. If
you plot this trend, you would imagine a line going up and to the left:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Suppose you have a table containing heap dump histogram data (a mapping of classes to how
much memory they consume):
https://riptutorial.com/ 17
-- ex: java.util.String
class character varying NOT NULL,
-- the size in bytes used by the above class
bytes integer NOT NULL
);
To compute the slope for each class, we group by over the class. The HAVING clause > 0
ensures that we get only candidates with a positive slop (a line going up and to the left). We sort
by the slope descending so that we get the classes with the largest rate of memory increase at the
top.
Output:
class | slope
---------------------------+----------------------
java.util.ArrayList | 71.7993806279174
java.util.HashMap | 49.0324576155785
java.lang.String | 31.7770770326123
joe.schmoe.BusinessObject | 23.2036817108056
java.lang.ThreadLocal | 20.9013528767851
From the output we see that java.util.ArrayList's memory consumption is increasing the fastest at
71.799 bytes per second and is potentially part of the memory leak.
https://riptutorial.com/ 18
Chapter 4: Backup and Restore
Remarks
I would avoid doing filesystem backups instead of regular Postgres backups, both for this reason,
and because Postgres backup files (especially in the custom format) are extremely versatile in
supporting alternate restores. Since they're single files, they're also less hassle to manage.
Examples
Backing up one database
The -Fc selects the "custom backup format" which gives you more power than raw SQL; see
pg_restore for more details. If you want a vanilla SQL file, you can do this instead:
or even
Restoring backups
A safer alternative uses -1 to wrap the restore in a transaction. The -f specifies the filename rather
than using shell redirection.
Custom format files must be restored using pg_restore with the -d option to specify the database:
https://riptutorial.com/ 19
The custom format can also be converted back to SQL:
Usage of the custom format is recommended because you can choose which things to restore and
optionally enable parallel processing.
You may need to do a pg_dump followed by a pg_restore if you upgrade from one postgresql
release to a newer one.
$ pg_dumpall -f backup.sql
This works behind the scenes by making multiple connections to the server once for each
database and executing pg_dump on it.
Sometimes, you might be tempted to set this up as a cron job, so you want to see the date the
backup was taken as part of the filename:
$ postgres-backup-$(date +%Y-%m-%d).sql
However, please note that this could produce large files on a daily basis. Postgresql has a much
better mechanism for regular backups - WAL archives
To take a filesystem backup, you must use these functions to help ensure that Postgres is in a
consistent state while the backup is prepared.
To insert into table user from a file named user_data.csv placed inside /home/user/:
https://riptutorial.com/ 20
To Copy data from pipe separated file to table
COPY user FROM '/home/user/user_data' WITH DELIMITER '|';
Note: In absence of the option with delimiter, the default delimiter is comma ,
Note: If data is quoted, by default data quoting characters are double quote. If the data is quoted
using any other character use the QUOTE option; however, this option is allowed only when using
CSV format.
https://riptutorial.com/ 21
Here program gzip is executed to compress user table data.
Data can be exported using copy command or by taking use of command line options of psql
command.
-F is to specify delimiter
-A or --no-align
Switches to unaligned output mode. (The default output mode is otherwise aligned.)
https://riptutorial.com/ 22
Chapter 5: Backup script for a production DB
Syntax
• The script allows you to create a backup directory for each execution with the following
syntax : Name of database backup directory + date and time of execution
• Example : prodDir22-11-2016-19h55
• After it's created, it creates two backup files with the following syntax : Name of database +
date and time of execution
• Example :
• dbprod22-11-2016-19h55.backup (dump file)
• dbprod22-11-2016-19h55.sql (sql file)
• At the end of one execution at 22-11-2016 @ 19h55, we get :
• /save_bd/prodDir22-11-2016-19h55/dbprod22-11-2016-19h55.backup
• /save_bd/prodDir22-11-2016-19h55/dbprod22-11-2016-19h55.sql
Parameters
parameter details
Remarks
1. If there is a backup tool such as HDPS, or Symantec Backup, ... It is necessary to empty the
backup directory before each launch.
To avoid cluttering the backup tool because the backup of old files is supposed to be done.
https://riptutorial.com/ 23
To enable this feature please uncomment line N° 3.
rm -R / save_db / *
2. In the case where the budget does not allow to have a tool of backup, one can always use
the tasks planner (cron command).
The following command is used to edit the cron table for the current user.
crontab -e
0 23 * * * /saveProdDb.sh
Examples
saveProdDb.sh
In general, we tend to back up the DB with the pgAdmin client. The following is a sh script used to
save the database (under linux) in two formats:
#!/bin/sh
cd /save_db
#rm -R /save_db/*
DATE=$(date +%d-%m-%Y-%Hh%M)
echo -e "Sauvegarde de la base du ${DATE}"
mkdir prodDir${DATE}
cd prodDir${DATE}
#dump file
/opt/postgres/9.0/bin/pg_dump -i -h localhost -p 5432 -U postgres -F c -b -w -v -f
"dbprod${DATE}.backup" dbprod
#SQL file
/opt/postgres/9.0/bin/pg_dump -i -h localhost -p 5432 -U postgres --format plain --verbose -f
"dbprod${DATE}.sql" dbprod
https://riptutorial.com/ 24
Chapter 6: COALESCE
Introduction
Coalesce returns the first none null argument from a set of arguments. Only the first non null
argument is return, all subsequent arguments are ignored. The function will evaluate to null if all
arguments are null.
Examples
Single non null argument
coalesce
--------
'HELLO WORLD'
PGSQL> SELECT COALESCE(NULL, NULL, 'first non null', null, null, 'second non null');
coalesce
--------
'first non null'
coalesce
--------
https://riptutorial.com/ 25
Chapter 7: Comments in postgresql
Introduction
COMMMENT main purpose is to define or change a comment on database object.
Only a single comment(string) can be given on any database object.COMMENT will help us to
know what for the particular database object has been defined whats its actual purpose is.
The rule for COMMENT ON ROLE is that you must be superuser to comment on a superuser role,
or have the CREATEROLE privilege to comment on non-superuser roles. Of course, a superuser
can comment on anything
Syntax
• COMMENT ON database_object object_name IS 'Text';
Remarks
Full syntax see: http://www.postgresql.org/docs/current/static/sql-comment.html
Examples
COMMENT on Table
Remove Comment
https://riptutorial.com/ 26
Chapter 8: Common Table Expressions
(WITH)
Examples
Common Table Expressions in SELECT Queries
Common table expressions support extracting portions of larger queries. For example:
WITH sales AS (
SELECT
orders.ordered_at,
orders.user_id,
SUM(orders.amount) AS total
FROM orders
GROUP BY orders.ordered_at, orders.user_id
)
SELECT
sales.ordered_at,
sales.total,
users.name
FROM sales
JOIN users USING (user_id)
https://riptutorial.com/ 27
empl.name
from
empl join t
on empl.boss = t.name
) select * from t order by path;
https://riptutorial.com/ 28
Chapter 9: Connect to PostgreSQL from Java
Introduction
The API to use a relational database from Java is JDBC.
To use it, put the JAR-file with the driver on the JAVA class path.
This documentation shows samples how to use the JDBC driver to connect to a database.
Remarks
JDBC URL
• jdbc:postgresql://host[:port]/[database][parameters]
• jdbc:postgresql:database[parameters]
• jdbc:postgresql:/[parameters]
is a list of key[=value] pairs, headed by ? and separated by &. If the value is missing, it is
parameters
assumed to be true.
An example:
jdbc:postgresql://localhost/test?user=fred&password=secret&ssl&sslfactory=org.postgresql.ssl.NonValidat
References
https://riptutorial.com/ 29
Examples
Connecting with java.sql.DriverManager
First, the driver has to be registered with java.sql.DriverManager so that it knows which class to
use.
This is done by loading the driver class, typically with java.lang.Class.forname(<driver class name>)
.
/**
* Connect to a PostgreSQL database.
* @param url the JDBC URL to connect to; must start with "jdbc:postgresql:"
* @param user the username for the connection
* @param password the password for the connection
* @return a connection object for the established connection
* @throws ClassNotFoundException if the driver class cannot be found on the Java class path
* @throws java.sql.SQLException if the connection to the database fails
*/
private static java.sql.Connection connect(String url, String user, String password)
throws ClassNotFoundException, java.sql.SQLException
{
/*
* Register the PostgreSQL JDBC driver.
* This may throw a ClassNotFoundException.
*/
Class.forName("org.postgresql.Driver");
/*
* Tell the driver manager to connect to the database specified with the URL.
* This may throw an SQLException.
*/
return java.sql.DriverManager.getConnection(url, user, password);
}
Not that user and password can also be included in the JDBC URL, in which case you don't have
to specify them in the getConnection method call.
Instead of specifying connection parameters like user and password (see a complete list here) in
the URL or a separate parameters, you can pack them into a java.util.Properties object:
/**
* Connect to a PostgreSQL database.
* @param url the JDBC URL to connect to. Must start with "jdbc:postgresql:"
* @param user the username for the connection
* @param password the password for the connection
* @return a connection object for the established connection
* @throws ClassNotFoundException if the driver class cannot be found on the Java class path
* @throws java.sql.SQLException if the connection to the database fails
*/
private static java.sql.Connection connect(String url, String user, String password)
throws ClassNotFoundException, java.sql.SQLException
https://riptutorial.com/ 30
{
/*
* Register the PostgreSQL JDBC driver.
* This may throw a ClassNotFoundException.
*/
Class.forName("org.postgresql.Driver");
java.util.Properties props = new java.util.Properties();
props.setProperty("user", user);
props.setProperty("password", password);
/* don't use server prepared statements */
props.setProperty("prepareThreshold", "0");
/*
* Tell the driver manager to connect to the database specified with the URL.
* This may throw an SQLException.
*/
return java.sql.DriverManager.getConnection(url, props);
}
It is common to use javax.sql.DataSource with JNDI in application server containers, where you
register a data source under a name and look it up whenever you need a connection.
/**
* Create a data source with connection pool for PostgreSQL connections
* @param url the JDBC URL to connect to. Must start with "jdbc:postgresql:"
* @param user the username for the connection
* @param password the password for the connection
* @return a data source with the correct properties set
*/
private static javax.sql.DataSource createDataSource(String url, String user, String password)
{
/* use a data source with connection pooling */
org.postgresql.ds.PGPoolingDataSource ds = new org.postgresql.ds.PGPoolingDataSource();
ds.setUrl(url);
ds.setUser(user);
ds.setPassword(password);
/* the connection pool will have 10 to 20 connections */
ds.setInitialConnections(10);
ds.setMaxConnections(20);
/* use SSL connections without checking server certificate */
ds.setSslMode("require");
ds.setSslfactory("org.postgresql.ssl.NonValidatingFactory");
return ds;
}
Once you have created a data source by calling this function, you would use it like this:
/* do some work */
https://riptutorial.com/ 31
conn.close();
https://riptutorial.com/ 32
Chapter 10: Data Types
Introduction
PostgreSQL has a rich set of native data types available to users. Users can add new types to
PostgreSQL using the CREATE TYPE command.
https://www.postgresql.org/docs/9.6/static/datatype.html
Examples
Numeric Types
Storage
Name Description Range
Size
-9223372036854775808 to
bigint 8 bytes large-range integer
+9223372036854775807
variable-precision,
real 4 bytes 6 decimal digits precision
inexact
double variable-precision,
precision 8 bytes 15 decimal digits precision
inexact
small
smallserial 2 bytes autoincrementing 1 to 32767
integer
autoincrementing
serial 4 bytes 1 to 2147483647
integer
https://riptutorial.com/ 33
Storage
Name Description Range
Size
autoincrementing
integer
Storage
Name Description Low Value High Value Resolution
Size
time
time of day (no 1 microsecond
(without 8 bytes 00:00:00 24:00:00
date) / 14 digits
time zone)
times of day
time (with 24:00:00- 1 microsecond
12 bytes only, with time 00:00:00+1459
time zone) 1459 / 14 digits
zone
range of
timestamp
tsrange
without time
zone
range of
tstzrange timestamp with
time zone
https://riptutorial.com/ 34
Geometric Types
Character Types
Name Description
Arrays
In PostgreSQL you can create Arrays of any built-in, user-defined or enum type. In default there is
no limit to an Array, but you can specify it.
Declaring an Array
https://riptutorial.com/ 35
SELECT integer[];
SELECT integer[3];
SELECT integer[][];
SELECT integer[3][3];
SELECT integer ARRAY;
SELECT integer ARRAY[3];
Creating an Array
SELECT '{0,1,2}';
SELECT '{{0,1},{1,2}}';
SELECT ARRAY[0,1,2];
SELECT ARRAY[ARRAY[0,1],ARRAY[1,2]];
Accessing an Array
By default PostgreSQL uses a one-based numbering convention for arrays, that is, an array of n
elements starts with array[1] and ends with array[n].
int_arr
---------
0
(1 row)
--sclicing an array
WITH arr AS (SELECT ARRAY[0,1,2] int_arr) SELECT int_arr[1:2] FROM arr;
int_arr
---------
{0,1}
(1 row)
array_dims
------------
[1:3]
(1 row)
array_length
--------------
3
(1 row)
https://riptutorial.com/ 36
--total number of elements across all dimensions
WITH arr AS (SELECT ARRAY[0,1,2] int_arr) SELECT cardinality(int_arr) FROM arr;
cardinality
-------------
3
(1 row)
Array functions
will be added
https://riptutorial.com/ 37
Chapter 11: Dates, Timestamps, and Intervals
Examples
Cast a timestamp or interval to a string
You can convert a timestamp or interval value to a string with the to_char() function:
This statement will produce the string "12 Aug 2016 04:40:32PM". The formatting string can be
modified in many different ways; the full list of template patterns can be found here.
Note that you can also insert plain text into the formatting string and you can use the template
patterns in any order:
This will produce the string "Today is Saturday, the 12th day of the month of August of 2016". You
should keep in mind, though, that any template patterns - even the single letter ones like "I", "D",
"W" - are converted, unless the plain text is in double quotes. As a safety measure, you should put
all plain text in double quotes, as done above.
You can localize the string to your language of choice (day and month names) by using the TM
(translation mode) modifier. This option uses the localization setting of the server running
PostgreSQL or the client connecting to it.
With a Spanish locale setting this produces "Sábado, 12 de Agosto del año 2016".
https://riptutorial.com/ 38
Chapter 12: Event Triggers
Introduction
Event Triggers will be fired whenever event associated with them occurs in database.
Remarks
Please use below link for complete overview of Event Triggers in PostgreSQL
https://www.postgresql.org/docs/9.3/static/event-trigger-definition.html
Examples
Logging DDL Command Start Events
Event Type-
• DDL_COMMAND_START
• DDL_COMMAND_END
• SQL_DROP
This is example for creating an Event Trigger and logging DDL_COMMAND_START events.
https://riptutorial.com/ 39
Chapter 13: Export PostgreSQL database
table header and data to CSV file
Introduction
From Adminer management tool it's has export to csv file option for mysql database But not
available for postgresql database. Here I will show the command to export CSV for postgresql
database.
Examples
Export PostgreSQL table to csv with header for some column(s)
Read Export PostgreSQL database table header and data to CSV file online:
https://riptutorial.com/postgresql/topic/8643/export-postgresql-database-table-header-and-data-to-
csv-file
https://riptutorial.com/ 40
Chapter 14: EXTENSION dblink and
postgres_fdw
Syntax
• dblink ('dbname = name_db_distance port = PortOfDB host = HostOfDB user = usernameDB
password = passwordDB', 'MY QUESRY')
Examples
Extention dblink
dblink EXTENSION is a technique to connect another database and make operation of this
database so to do that you need:
For exemple Select some attribute from another table in another database:
SELECT * FROM
dblink ('dbname = bd_distance port = 5432 host = 10.6.6.6 user = username
password = passw@rd', 'SELECT id, code FROM schema.table')
AS newTable(id INTEGER, code character varying);
Extention FDW
1-Create an extention:
https://riptutorial.com/ 41
CREATE EXTENSION postgres_fdw;
2-Create SERVER:
CREATE SERVER name_srv FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'hostname',
dbname 'bd_name', port '5432');
CREATE USER MAPPING FOR postgres SERVER name_srv OPTIONS(user 'postgres', password
'password');
To access complete schema of server db instead of single table. Follow below steps:
1. Create EXTENSION :
2. Create SERVER :
CREATE SERVER server_name FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'host_ip',
dbname 'db_name', port 'port_number');
https://riptutorial.com/ 42
INTO schema_name;
https://riptutorial.com/ 43
Chapter 15: Find String Length / Character
Length
Introduction
To get length of "character varying", "text" fields, Use char_length() or character_length().
Examples
Example to get length of a character varying field
Result:
Result:
https://riptutorial.com/ 44
Chapter 16: Inheritance
Remarks
An explanation as to why you would want to use inheritance in PostgreSQL is available here:
http://stackoverflow.com/a/3075248/653378
Examples
Creating children tables
users
Column Type
username text
email text
simple_users
Column Type
username text
email text
users_with_password
Column Type
username text
email text
password text
https://riptutorial.com/ 45
Altering tables
Adding columns
ALTER TABLE simple_users ADD COLUMN password text;
simple_users
Column Type
username text
email text
password text
Adding the same column to the parent table will merge the definition of both columns:
Dropping columns
Using our altered tables:
users
Column Type
username text
email text
https://riptutorial.com/ 46
simple_users
Column Type
username text
email text
password text
Since we first added the column to simple_users, PostgreSQL makes sure this column isn't
dropped.
Now if we had another child table, its password column would, of course, have been dropped.
https://riptutorial.com/ 47
Chapter 17: INSERT
Examples
Basic INSERT
The most basic insert involves inserting all values in the table:
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
If you want to insert only specific columns, you need to explicitly indicate which columns:
Note that if any constraints exist on the table , such as NOT NULL, you will be required to include
those columns in either case.
You can insert multiple rows in the database at the same time:
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
Note that the projection of the select must match the columns required for the insert. In this case,
the tmp_person table has the same columns as person.
COPY is PostgreSQL's bulk-insert mechanism. It's a convenient way to transfer data between files
https://riptutorial.com/ 48
and tables, but it's also far faster than INSERT when adding more than a few thousand rows at a
time.
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
And we need a two column table into which this data can be imported into.
Now the actual copy operation, this will create six records in the table.
If you are inserting data into a table with an auto increment column and if you want to get the value
https://riptutorial.com/ 49
of the auto increment column.
If you want to insert data into my_table and get the id of that row:
Above query will return the id of the row where the new record was inserted.
since version 9.5 postgres offers UPSERT functionality with INSERT statement.
Say you have a table called my_table, created in several previous examples. We insert a row,
returning PK value of inserted row:
https://riptutorial.com/ 50
(1 row)
INSERT 0 1
Now if we try to insert row with existing unique key it will raise an exception:
b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name =
my_table.name||' changed to: "two" at '||now() returning *;
id | name | contact_number
----+-----------------------------------------------------------------------------------------
------------------+----------------
2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 | 333
(1 row)
INSERT 0 1
https://riptutorial.com/ 51
Chapter 18: JSON Support
Introduction
JSON - Java Script Object Notation , Postgresql support JSON Data type since 9.2 version. There
are some predefined function and operators to access the JSON data. The -> operator returns the
key of JSON column. The ->> operator returns the value of JSON Column.
Examples
Creating a pure JSON table
To create a pure JSON table you need to provide a single field with the type JSONB:
At this point you can insert data in to the table and query it efficiently.
https://riptutorial.com/ 52
"work": {
"city": "Edinburgh",
"country": "United Kingdom"
}
}
}
$$);
the first statement will use the index created above whereas the latter two will not, requiring a
complete table scan.
It is still allowable to use the -> operator when obtaining resultant data, so the following queries
will also use the index:
https://riptutorial.com/ 53
DROP DATABASE IF EXISTS books_db;
CREATE DATABASE books_db WITH ENCODING='UTF8' TEMPLATE template0;
Populating the DB
INSERT INTO books(client, data) values (
'Joe',
'{ "title": "Siddhartha", "author": { "first_name": "Herman", "last_name": "Hesse" } }'
),(
'Jenny',
'{ "title": "Dharma Bums", "author": { "first_name": "Jack", "last_name": "Kerouac" } }'
),(
'Jenny',
'{ "title": "100 años de soledad", "author": { "first_name": "Gabo", "last_name":
"Marquéz" } }'
);
Output:
columns
Selecting 1 column:
SELECT client,
data->'title' AS title
FROM books;
Output:
https://riptutorial.com/ 54
Selecting 2 columns:
SELECT client,
data->'title' AS title, data->'author' AS author
FROM books;
Output:
-> vs ->>
The -> operator returns the original JSON type (which might be an object), whereas ->> returns
text.
SELECT client,
data->'author'->'last_name' AS author
FROM books;
Output:
Filtering
Select rows based on a value inside your JSON:
SELECT
client,
https://riptutorial.com/ 55
data->'title' AS title
FROM books
WHERE data->'title' = '"Dharma Bums"';
Output:
Nested filtering
Find rows based on the value of a nested JSON object:
SELECT
client,
data->'title' AS title
FROM books
WHERE data->'author'->>'last_name' = 'Kerouac';
Output:
We’re going to store events in this table, like pageviews. Each event has properties, which could
be anything (e.g. current page) and also sends information about the browser (like OS, screen
resolution, etc). Both of these are completely free form and could change over time (as we think of
extra stuff to track).
https://riptutorial.com/ 56
'pageview', '2',
'{ "page": "/" }',
'{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1920, "y": 1200 } }'
),(
'pageview', '1',
'{ "page": "/account" }',
'{ "name": "Chrome", "os": "Mac", "resolution": { "x": 1440, "y": 900 } }'
),(
'purchase', '5',
'{ "amount": 10 }',
'{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1024, "y": 768 } }'
),(
'purchase', '15',
'{ "amount": 200 }',
'{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }'
),(
'purchase', '15',
'{ "amount": 500 }',
'{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }'
);
Output:
Output:
https://riptutorial.com/ 57
• Total revenue per visitor:
Output:
Output:
https://riptutorial.com/ 58
Chapter 19: Postgres cryptographic functions
Introduction
In Postgres, cryptographic functions can be unlocked by using pgcrypto module. CREATE
EXTENSION pgcrypto;
Examples
digest
DIGEST() functions generate a binary hash of the given data. This can be used to create a random
hash.
Examples:
https://riptutorial.com/ 59
Chapter 20: Postgres Tip and Tricks
Examples
DATEADD alternative in Postgres
• SELECT CURRENT_DATE + '1 day'::INTERVAL
• SELECT '1999-12-11'::TIMESTAMP + '19 days'::INTERVAL
• SELECT '1 month'::INTERVAL + '1 month 3 days'::INTERVAL
SELECT
string_agg(<TABLE_NAME>.<COLUMN_NAME>, ',')
FROM
<SCHEMA_NAME>.<TABLE_NAME> T
DELETE
FROM <SCHEMA_NAME>.<Table_NAME>
WHERE
ctid NOT IN
(
SELECT
MAX(ctid)
FROM
<SCHEMA_NAME>.<TABLE_NAME>
GROUP BY
<SCHEMA_NAME>.<TABLE_NAME>.*
)
;
Update query with join between two tables alternative since Postresql does
not support join in update query.
update <SCHEMA_NAME>.<TABLE_NAME_1> AS A
SET <COLUMN_1> = True
FROM <SCHEMA_NAME>.<TABLE_NAME_2> AS B
WHERE
A.<COLUMN_2> = B.<COLUMN_2> AND
A.<COLUMN_3> = B.<COLUMN_3>
Difference between two date timestamps month wise and year wise
select
(
https://riptutorial.com/ 60
(DATE_PART('year', AgeonDate) - DATE_PART('year', tmpdate)) * 12
+
(DATE_PART('month', AgeonDate) - DATE_PART('month', tmpdate))
)
from dbo."Table1"
First Execute
Then
INSERT INTO
<SCHEMA_NAME>.<TABLE_NAME_1>
SELECT *
FROM
DBLINK(
'HOST=<IP-ADDRESS> USER=<USERNAME> PASSWORD=<PASSWORD> DBNAME=<DATABASE>',
'SELECT * FROM <SCHEMA_NAME>.<TABLE_NAME_2>')
AS <TABLE_NAME>
(
<COLUMN_1> <DATATYPE_1>,
<COLUMN_1> <DATATYPE_2>,
<COLUMN_1> <DATATYPE_3>
);
https://riptutorial.com/ 61
Chapter 21: PostgreSQL High Availability
Examples
Replication in PostgreSQL
○ Requirements:
mkdir $PGDATA/archive
This is host base authentication file, contains the setting for client autherntication. Add
below entry:
wal_level = hot_standby
`hot_standby` logs what is required to accept read only queries on slave server.
archive_mode=on
https://riptutorial.com/ 62
archive_command parameter.
Basically what above archive_command does is it copies the WAL segments to archive
directory.
Important: Don't start the service again until all configuration and backup steps are
complete. You must bring up the standby server in a state where it is ready to be a
backup server. This means that all configuration settings must be in place and the
databases must be already synchronized. Otherwise, streaming replication will fail to
start`
pg_basebackup utility copies the data from primary server data directory to slave data
directory.
-h: Specifies the system where to look for the primary server
-xlog-method=stream: This will force the pg_basebackup to open another connection and
stream enough xlog while backup is running.
It also ensures that fresh backup can be started without failing back
to using an archive.
To configure the standby server, you'll edit postgresql.conf and create a new configuration
file named recovery.conf.
hot_standby = on
This specifies whether you are allowed to run queries while recovering
standby_mode = on
Set the connection string to the primary server. Replace with the external IP address of
the primary server. Replace with the password for the user named replication
https://riptutorial.com/ 63
`primary_conninfo = 'host= port=5432 user=replication password='
trigger_file = '/tmp/postgresql.trigger.5432'
The trigger_file path that you specify is the location where you can add a file when
you want the system to fail over to the standby server. The presence of the file
"triggers" the failover. Alternatively, you can use the pg_ctl promote command to
trigger failover.
You now have everything in place and are ready to bring up the standby server
Attribution
This article is substantially derived from and attributed to How to Set Up PostgreSQL for High
Availability and Replication with Hot Standby, with minor changes in formatting and examples and
some text deleted. The source was published under the Creative Commons Public License 3.0,
which is maintained here.
https://riptutorial.com/ 64
Chapter 22: Programming with PL/pgSQL
Remarks
PL/pgSQL is PostgreSQL's built-in programming language for writing functions which run within
the database itself, known as stored procedures in other databases. It extends SQL with loops,
conditionals, and return types. Though its syntax may be strange to many developers it is much
faster than anything running on the application server because the overhead of connecting to the
database is eliminated, which is particularly useful when you would otherwise need to execute a
query, wait for the result, and submit another query.
Though many other procedural languages exist for PostgreSQL, such as PL/Python, PL/Perl, and
PLV8, PL/pgSQL is a common starting point for developers who want to write their first
PostgreSQL function because its syntax builds on SQL. It is also similar to PL/SQL, Oracle's
native procedural language, so any developer familiar with PL/SQL will find the language familiar,
and any developer who intends to develop Oracle applications in the future but wants to start with
a free database can transition from PL/pgSQL to PL/SQL with relative ease.
It should be emphasized that other procedural languages exist and PL/pgSQL is not necessarily
superior to them in any way, including speed, but examples in PL/pgSQL can serve as a common
reference point for other languages used for writing PostgreSQL functions. PL/pgSQL has the
most tutorials and books of all the PLs and can be a springboard to learning the languages with
less documentation.
Examples
Basic PL/pgSQL Function
https://riptutorial.com/ 65
SELECT COUNT(user_id) INTO subscribers FROM users WHERE subscribed;
-- function result
RETURN subscribers;
EXCEPTION
-- return NULL if table "users" does not exist
WHEN undefined_table
THEN RETURN NULL;
END;
$$ LANGUAGE plpgsql;
This could have been achieved with just the SQL statement but demonstrates the basic structure
of a function.
select active_subscribers();
PL/pgSQL Syntax
RETURNS Block
custom exceptions
https://riptutorial.com/ 66
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
calling:
t=# do
$$
declare
_t text;
begin
perform s165();
exception when SQLSTATE 'P0001' then raise info '%','state P0001 caught: '||SQLERRM;
perform s164();
end;
$$
;
INFO: state P0001 caught: nothing specified
ERROR: S 164
DETAIL: D 164
HINT: H 164
CONTEXT: SQL statement "SELECT s164()"
PL/pgSQL function inline_code_block line 7 at PERFORM
here custom P0001 processed, and P2222, not, aborting the execution.
https://riptutorial.com/ 67
Chapter 23: Recursive queries
Introduction
There are no real recursive querys!
Examples
Sum of Integers
Link to Documentation
https://riptutorial.com/ 68
Chapter 24: Role Management
Syntax
• CREATE ROLE name [ [ WITH ] option [ ... ] ]
Examples
Create a user with a password
Generally you should avoid using the default database role (often postgres) in your application.
You should instead create a user with lower levels of privileges. Here we make one called
niceusername and give it a password very-strong-password
The problem with that is that queries typed into the psql console get saved in a history file
.psql_history in the user's home directory and may as well be logged to the PostgreSQL database
server log, thus exposing the password.
To avoid this, use the \password command to set the user password. If the user issuing the
command is a superuser, the current password will not be asked. (Must be superuser to alter
passwords of superusers)
To support a given application, you often create a new role and database to match.
$ createuser -P blogger
Enter password for the new role: ********
Enter it again: ********
This assumes that pg_hba.conf has been properly configured, which probably looks like this:
https://riptutorial.com/ 69
# TYPE DATABASE USER ADDRESS METHOD
host sameuser all localhost md5
local sameuser all md5
--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT CONNECT ON DATABASE nova TO user;
With the above queries, untrusted users can no longer connect to the database.
--ACCESS SCHEMA
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE ON SCHEMA public TO user;
The next set of queries revoke all privileges from unauthenticated users and provide limited set of
privileges for the read_write user.
--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL ON ALL TABLES IN SCHEMA public TO admin ;
--ACCESS SEQUENCES
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO read_only; -- allows the use of CURRVAL
GRANT UPDATE ON ALL SEQUENCES IN SCHEMA public TO read_write; -- allows the use of NEXTVAL and
SETVAL
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO read_write; -- allows the use of CURRVAL and
NEXTVAL
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO admin;
https://riptutorial.com/ 70
(1 row)
2. Set search_path with alter user command to append a new schema my_schema
Alternative:
With below queries, you can set access privileges on objects created in the future in specified
schema.
Or, you can set access privileges on objects created in the future by specified user.
ALTER DEFAULT PRIVILEGES FOR ROLE admin GRANT SELECT ON TABLES TO read_only;
https://riptutorial.com/ 71
Create Read Only User
https://riptutorial.com/ 72
Chapter 25: SELECT
Examples
SELECT using WHERE
+----+------------+-----------+----------+------+
| id | first_name | last_name | username | pass |
+----+------------+-----------+----------+------+
| 1 | hello | world | hello | word |
+----+------------+-----------+----------+------+
| 2 | root | me | root | toor |
+----+------------+-----------+----------+------+
Syntax
Examples
https://riptutorial.com/ 73
Chapter 26: Table Creation
Examples
Table creation with Primary Key
Alternatively, you can place the PRIMARY KEY constraint directly in the column definition:
It is recommended that you use lower case names for the table and as well as all the columns. If
you use upper case names such as Person you would have to wrap that name in double quotes (
"Person") in each and every query because PostgreSQL enforces case folding.
Open the psql command line tool connected to the database where your table is. Then type the
following command:
\d tablename
\d+ tablename
If you have forgotten the name of the table, just type \d into psql to obtain a list of tables and views
in the current database.
https://riptutorial.com/ 74
person_id BIGINT NOT NULL,
last_name VARCHAR(255) NOT NULL,
first_name VARCHAR(255),
age INT NOT NULL,
PRIMARY KEY (person_id)
);
CREATE TABLE people_over_30 AS SELECT * FROM person WHERE age > 30;
You can create unlogged tables so that you can make the tables considerably faster. Unlogged
table skips writing write-ahead log which means it's not crash-safe and unable to replicate.
In this example, User Table will have a column that references the Agency table.
https://riptutorial.com/ 75
Chapter 27: Triggers and Trigger Functions
Introduction
The trigger will be associated with the specified table or view and will execute the specified
function function_name when certain events occur.
Remarks
Please use below link for complete overview of:
• Triggers: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
• Trigger Functions: https://www.postgresql.org/docs/current/static/plpgsql-trigger.html
Examples
Basic PL/pgSQL Trigger Function
BEGIN
-- TG_TABLE_NAME :name of the table that caused the trigger invocation
IF (TG_TABLE_NAME = 'users') THEN
END IF;
RETURN null;
END IF;
END;
$BODY$
https://riptutorial.com/ 76
LANGUAGE plpgsql VOLATILE
COST 100;
Type of triggers
https://riptutorial.com/ 77
CREATE OR REPLACE FUNCTION add_created_at_function()
RETURNS trigger AS $BODY$
BEGIN
NEW.created_at := NOW();
RETURN NEW;
END $BODY$
LANGUAGE plpgsql;
Step 3: test it
https://riptutorial.com/ 78
(TG_TABLE_NAME, vId, vDescription, NOW());
RETURN vReturn;
END $BODY$
LANGUAGE plpgsql;
Step 3: test it
https://riptutorial.com/ 79
Chapter 28: UPDATE
Examples
Update all rows in a table
You can update multiple columns in a table in the same statement, separating col=val pairs with
commas:
UPDATE person
SET country = 'USA',
state = 'NY'
WHERE city = 'New York';
You can also update data in a table based on data from another table:
UPDATE person
SET state_code = cities.state_code
FROM cities
WHERE cities.city = city;
Here we are joining the person city column to the cities city column in order to get the city's state
code. This is then used to update the state_code column in the person table.
https://riptutorial.com/ 80
Chapter 29: Window Functions
Examples
generic example
Preparing data:
Running:
select *
, dense_rank() over (order by i) dist_by_i
, lag(t) over () prev_t
, nth_value(i, 6) over () nth
, count(true) over (partition by i) num_by_i
, count(true) over () num_all
, ntile(3) over() ntile
from wf_example
;
Result:
Explanation:
dist_by_i: dense_rank() over (order by i) is like a row_number per distinct values. Can be used for
the number of distinct values of i (count(DISTINCT i) wold not work). Just use the maximum value.
prev_t: lag(t) over () is a previous value of t over the whole window. mind that it is null for the first
row.
https://riptutorial.com/ 81
nth: nth_value(i, 6) over () is the value of sixth rows column i over the whole window
ntile: ntile(3) over() splits the whole window to 3 (as much as possible) equal in quantity parts
select i
, dense_rank() over (order by i)
, row_number() over ()
, rank() over (order by i)
from wf_example
• dense_rank orders VALUES of i by appearance in window. i=1 appears, so first row has
dense_rank, next and third i value does not change, so it is dense_rank shows 1 - FIRST
value not changed. fourth row i=2, it is second value of i met, so dense_rank shows 2, andso
for the next row. Then it meets value i=3 at 6th row, so it show 3. Same for the rest two
values of i. So the last value of dense_rank is the number of distinct values of i.
• rank Not to confuse with dense_rank this function orders ROW NUMBER of i values. So it
starts same with three ones, but has next value 4, which means i=2 (new value) was met at
row 4. Same i=3 was met at row 6. Etc..
https://riptutorial.com/ 82
Credits
S.
Chapters Contributors
No
Accessing Data
2 AstraSerg, brichins, greg, Laurenz Albe
Programmatically
4 Backup and Restore ankidaemon, Ben H, Daniel Lyons, e4c5, Laurel, mnoronha
6 COALESCE Mokadillion
Comments in
7 Ben, KIRAN KUMAR MATAM
postgresql
Common Table
8 Daniel Lyons, Jakub Fedyczak, Kevin Sylvestre
Expressions (WITH)
Connect to
9 PostgreSQL from Laurenz Albe
Java
Dates, Timestamps,
11 KIM, Nuri Tasdemir, Patrick, Tom Gerken
and Intervals
Export PostgreSQL
database table
13 Vao Tsun, wOwhOw
header and data to
CSV file
EXTENSION dblink
14 Riya Bansal, YCF_L
and postgres_fdw
https://riptutorial.com/ 83
Character Length
16 Inheritance evuez
Postgres
19 cryptographic Ben H, skj123
functions
PostgreSQL High
21 gpdude_, Patrick
Availability
Programming with
22 AndrewCichocki, Ben H, Goerman, Laurenz Albe, Vao Tsun
PL/pgSQL
25 SELECT YCF_L
https://riptutorial.com/ 84