Serial Numbers In PostgreSQL Explained

This post is part of a series on the numeric data types found in PostgreSQL. Read on to learn all about defining arbitrary precision numbers in PostgreSQL. Write a comment if you have any questions or corrections!

Serial Numbers

Name Storage size Range
smallserial 2 bytes 1 - 32,767
serial 4 bytes 1 - 2,147,483,647
bigserial 8 bytes 1 - 9,223,372,036,854,775,807

The serial data type is PostgreSQL's way of specifying an autoincrementing numeric column. In this sense, it is not a true type. It's pretty convenient though. Specifying:

CREATE TABLE books (
  id SERIAL
);

is equivalent to this:

CREATE SEQUENCE books_id_seq;
CREATE TABLE books (
    id INTEGER NOT NULL DEFAULT nextval('books_id_seq')
);
ALTER SEQUENCE books_id_seq OWNED BY books.id;

Definitely the first option is much less verbose! Typically you see the serial type used with the UNIQUE or PRIMARY KEY constraints. Also, you'll notice that a serial data type has the NOT NULL constraint applied to it automatically, to ensure that a null value can't be inserted.

The serial types are equivalent to the integer types as far as their positive range goes.

  • smallserial (range: 1 - 32,767) = positive smallint range (1 - 32,767)
  • serial = int
  • bigserial = bigint

More Numeric Types

Learn about the other numeric data types in one of the following posts:

What to see more of this kind of content? Let me know in the comments or reach out on Twitter!