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
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.
SMALLINT
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
:
CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
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.
INTEGER
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:
CREATE TABLE cities (
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
.
BIGINT
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