You are on page 1of 4

PostgreSQL SERIAL To Create Auto-

increment Column

Summary: in this tutorial, you will learn


about the PostgreSQL SERIAL pseudo-type and how to use the SERIAL pseudo-type to
define auto-increment columns in tables.

Introduction to the PostgreSQL SERIAL pseudo-type


In PostgreSQL, a sequence is a special kind of database object that generates a sequence
of integers. A sequence is often used as the primary key column in a table.

When creating a new table, the sequence can be created through the SERIAL pseudo-
type as follows:

1 CREATE TABLE table_name(


2 id SERIAL
3 );

By assigning the SERIAL pseudo-type to the id column, PostgreSQL performs the


following:

 First, create a sequence object and set the next value generated by the sequence
as the default value for the column.
 Second, add a NOT NULL constraint to the id column because a sequence always
generates an integer, which is a non-null value.
 Third, assign the owner of the sequence to the id column; as a result, the
sequence object is deleted when the id column or table is dropped

Behind the scenes, the following statement:


1 CREATE TABLE table_name(
2 id SERIAL
3 );

is equivalent to the following statements:

1 CREATE SEQUENCE table_name_id_seq;


2
3 CREATE TABLE table_name (
4 id integer NOT NULL DEFAULT nextval('table_name_id_seq')
5 );
6
7 ALTER SEQUENCE table_name_id_seq
8 OWNED BY table_name.id;

PostgreSQL provides three serial pseudo-types SMALLSERIAL, SERIAL, and BIGSERIAL


with the following characteristics:

Name Storage Size Range


SMALLSERIAL 2 bytes 1 to 32,767
SERIAL 4 bytes 1 to 2,147,483,647
BIGSERIAL 8 bytes 1 to 9,223,372,036,854,775,807

PostgreSQL SERIAL example


It is important to note that the SERIAL does not implicitly create an index on the column
or make the column as the primary key column. However, this can be done easily by
specifying the PRIMARY KEY constraint for the SERIAL column.

The following statement creates the fruits table with the id column as the SERIAL
column:

1 CREATE TABLE fruits(


2 id SERIAL PRIMARY KEY,
3 name VARCHAR NOT NULL
4 );

To assign the default value for a serial column when you insert row into the table, you
ignore the column name or use the DEFAULT keyword in the INSERT statement.

See the following example:

1 INSERT INTO fruits(name)


2 VALUES('Orange');

Or
1 INSERT INTO fruits(id,name)
2 VALUES(DEFAULT,'Apple');

PostgreSQL inserted two rows into the fruits table with the values for the id column
are 1 and 2.

1 SELECT * FROM fruits;


1 id | name
2 ----+--------
3 1 | Apple
4 2 | Orange
5 (2 rows)

To get the sequence name of a SERIAL column in a table, you use the
pg_get_serial_sequence() function as follows:

1 pg_get_serial_sequence('table_name','column_name')

You can pass a sequence name to the currval() function to get the recent value
generated by the sequence. For example, the following statement returns the recent
value generated by the fruits_id_seq object:

1 SELECT currval(pg_get_serial_sequence('fruits', 'id'));


1 currval
2 ---------
32
4 (1 row)

If you want to get the value generated by the sequence when you insert a new row into
the table, you use the RETURNING id clause in the INSERT statement.

The following statement inserts a new row into the fruits table and returns the value
generated for the id column.

1 INSERT INTO fruits(name)


2 VALUES('Banana')
3 RETURNING id;
1 id
2 ----
33
4 (1 row)

The sequence generator operation is not transaction-safe. It means that if two concurrent
database connections attempt to get the next value from a sequence, each client will get
a different value. If one client rolls back the transaction, the sequence number of that
client will be unused, creating a gap in the sequence.
In this tutorial, you have learned how to use the PostgreSQL pseudo-type SERIAL to
create an auto-increment column for a table.

Related Tutorials

You might also like