--- title: Postgres Integer data types subtitle: Work with integers in Postgres enableTableOfContents: true updatedOn: '2024-02-03T16:07:31.867Z' --- In Postgres, integer data types are used for storing numerical values without a fractional component. They are useful as identifiers, counters, and many other common data modeling tasks. Postgres offers multiple integer types, catering to different ranges of values and storage sizes. ## Storage and syntax Postgres supports three primary integer types. Choosing the appropriate integer type depends on the range of data expected. 1. `SMALLINT`: A small-range integer, occupying 2 bytes of storage. It's useful for columns with a small range of values. 2. `INTEGER`: The standard integer type, using 4 bytes of storage. It's the most commonly used since it balances storage/performance efficiency and range capacity. 3. `BIGINT`: A large-range integer, taking up 8 bytes. It's used when the range of `INTEGER` is insufficient. Note that Postgres doesn't support unsigned integers. All integer types can store both positive and negative values. ## Example usage Consider a database for a small online bookstore. Here, `SMALLINT` could be used for storing the number of copies of a book in stock, while `INTEGER` would be appropriate for a unique identifier for each book. The query below creates a `books` table with these columns: ```sql CREATE TABLE books ( book_id INTEGER PRIMARY KEY, title TEXT NOT NULL, copies_in_stock SMALLINT ); INSERT INTO books (book_id, title, copies_in_stock) VALUES (1, 'War and Peach', 50), (2, 'The Great Gatsby', 20), (3, 'The Catcher in the Rye', 100); ``` ## Other examples ### Integer operations Postgres supports various arithmetic operations on integer types, including addition, subtraction, multiplication, and division. Note that the division of integers does not yield a fractional result; it truncates the result to an integer. ```sql SELECT 10 / 4; -- Yields 2, not 2.5 ``` ## Sequences and auto-Increment Postgres also provides `SERIAL`, which is a pseudo-type for creating auto-incrementing integers, often used for primary keys. It's effectively an `INTEGER` that automatically increments with each new row insertion. There is also `BIGSERIAL` and `SMALLSERIAL` for auto-incrementing `BIGINT` and `SMALLINT` columns, respectively. For example, we can create an `orders` table with an auto-incrementing `order_id` column: ```sql CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, order_details TEXT ); INSERT INTO orders (order_details) VALUES ('Order 1'), ('Order 2'), ('Order 3'); RETURNING *; ``` This query returns the following: ```text order_id | order_details ----------+--------------- 1 | Order 1 2 | Order 2 3 | Order 3 ``` The `order_id` column gets a unique integer value for each new order. ## Additional considerations - **Data integrity**: Integer types strictly store numerical values. Attempting to insert non-numeric data, or a value outside the range of that particular type will result in an error. - **Performance**: Choosing the correct integer type (`SMALLINT`, `INTEGER`, `BIGINT`) based on the expected value range can optimize storage efficiency and performance. ## Resources - [PostgreSQL documentation - Numeric Types](https://www.postgresql.org/docs/current/datatype-numeric.html)