PostgreSQL Tutorial: Integer Data Types

August 2, 2023

Summary: this tutorial introduces you to various PostgreSQL integer types including SMALLINT, INTEGER, and BIGINT.

Table of Contents

Introduction to PostgreSQL integer types

postgresql integer

To store the whole numbers in PostgreSQL, you use one of the following integer types: SMALLINT, INTEGER, and BIGINT.

The following table illustrates the specification of each integer type:

Name Storage Size Min Max
SMALLINT 2 bytes -32,768 +32,767
INTEGER 4 bytes -2,147,483,648 +2,147,483,647
BIGINT 8 bytes -9,223,372,036,854,775,808 +9,223,372,036,854,775,807

If you try to store a value outside of the permitted range, PostgreSQL will issue an error.

Unlike MySQL integer, PostgreSQL does not provide unsigned integer types.


The SMALLINT requires 2 bytes storage size which can store any integer numbers that is in the range of (-32,767, 32,767).

You can use the SMALLINT type for storing something like ages of people, the number of pages of a book, etc.

The following statement creates a table named books:

    title VARCHAR (255) NOT NULL,
    pages SMALLINT NOT NULL CHECK (pages > 0)

In this example, the pages column is a SMALLINT column. Because the number of pages of a book must be positive, we added a CHECK constraint to enforce this rule.


The INTEGER is the most common choice between integer types because it offers the best balance between storage size, range, and performance.

The INTEGER type requires 4 bytes storage size that can store numbers in the range of (-2,147,483,648, 2,147,483,647).

You can use the INTEGER type for a column that stores quite big whole numbers like the population of a city or even country as the following example:

    city_id serial PRIMARY KEY,
    city_name VARCHAR (255) NOT NULL,
    population INT NOT NULL CHECK (population >= 0)

Notice that INT is the synonym of INTEGER.


In case you want to store the whole numbers that are out of the range of the INTEGER type, you can use the BIGINT type.

The BIGINT type requires 8 bytes storage size that can store any number in the range of (-9,223,372,036,854,775,808,+9,223,372,036,854,775,807).

Using BIGINT type is not only consuming a lot of storage but also decreasing the performance of the database, therefore, you should have a good reason to use it.

See more

PostgreSQL Tutorial: Data Types

PostgreSQL Documentation: Integer Types