Serial and identity columns in PostgreSQL - Time & Space Complexity
When using serial or identity columns in PostgreSQL, it's important to understand how the database generates unique numbers as new rows are added.
We want to see how the time to get the next number grows as more rows are inserted.
Analyze the time complexity of inserting rows with a serial or identity column.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');
-- More inserts follow
This code creates a table with a serial column that auto-generates unique IDs for each new row.
Each insert operation requests the next number from a sequence.
- Primary operation: Fetching the next sequence value.
- How many times: Once per inserted row.
Getting the next number from a sequence is a simple, direct operation that does not depend on how many rows exist.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 sequence fetches |
| 100 | 100 sequence fetches |
| 1000 | 1000 sequence fetches |
Pattern observation: Each insert does one sequence fetch, so the work grows linearly with the number of inserts.
Time Complexity: O(n)
This means the total time grows directly in proportion to the number of rows inserted.
[X] Wrong: "Fetching the next serial number gets slower as the table grows because it has to check all existing rows."
[OK] Correct: The sequence value is stored separately and does not scan the table, so fetching the next number stays fast regardless of table size.
Understanding how sequences work helps you explain database behavior clearly and shows you know how auto-generated keys perform as data grows.
What if we replaced the serial column with a UUID generated on insert? How would the time complexity of generating unique IDs change?
Practice
What is the main purpose of using SERIAL or IDENTITY columns in PostgreSQL?
Solution
Step 1: Understand the role of SERIAL and IDENTITY
Both SERIAL and IDENTITY columns are designed to automatically generate unique numeric values for new rows in a table.Step 2: Identify the main purpose
This automatic numbering helps avoid manual entry and ensures unique identifiers for each row.Final Answer:
To automatically generate unique numbers for new rows -> Option AQuick Check:
Serial and identity columns = auto unique numbers [OK]
- Thinking SERIAL stores text data
- Confusing SERIAL with indexing
- Assuming SERIAL creates foreign keys
Which of the following is the correct syntax to create a table with an IDENTITY column named id in PostgreSQL?
CREATE TABLE users ( id ???, name TEXT );
Solution
Step 1: Recall IDENTITY syntax in PostgreSQL
The correct syntax usesGENERATED ALWAYS AS IDENTITYfor identity columns.Step 2: Match the option with correct syntax
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY usesINTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, which is valid PostgreSQL syntax.Final Answer:
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY -> Option CQuick Check:
IDENTITY syntax = GENERATED ALWAYS AS IDENTITY [OK]
- Using AUTO_INCREMENT (MySQL syntax)
- Confusing SERIAL with IDENTITY syntax
- Omitting GENERATED ALWAYS or BY DEFAULT
Given the table creation:
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO products (name) VALUES ('Pen'), ('Pencil'), ('Eraser');
SELECT product_id FROM products ORDER BY product_id;What will be the output of the SELECT query?
Solution
Step 1: Understand SERIAL behavior on insert
The SERIAL column auto-increments starting from 1 for each inserted row.Step 2: Check inserted rows and ordering
Three rows inserted get product_id values 1, 2, and 3 respectively. Ordering by product_id returns them in ascending order.Final Answer:
[1, 2, 3] -> Option DQuick Check:
SERIAL starts at 1 and increments [OK]
- Assuming numbering starts at 0
- Expecting NULL values for SERIAL
- Thinking order is descending by default
Consider this table creation:
CREATE TABLE orders ( order_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, product TEXT );
Which of the following statements will cause an error when inserting data?
Solution
Step 1: Understand GENERATED BY DEFAULT AS IDENTITY behavior
This allows manual insertion of order_id or automatic generation if omitted.Step 2: Analyze each insert statement
INSERT INTO orders (order_id, product) VALUES (5, 'Pen'), (5, 'Pencil'); tries to insert two rows with the same order_id = 5, violating the primary key uniqueness constraint, causing an error.Final Answer:
INSERT with duplicate order_id values causes error -> Option AQuick Check:
Duplicate primary keys cause insert errors [OK]
- Assuming GENERATED BY DEFAULT forbids manual IDs
- Ignoring primary key uniqueness
- Thinking DEFAULT keyword causes errors
You want to create a table employees with a IDENTITY column named id that automatically generates unique IDs but also allows you to insert specific IDs manually when needed. Which is the best way to define the ID column?
Solution
Step 1: Understand difference between GENERATED ALWAYS and BY DEFAULT
GENERATED ALWAYS AS IDENTITY disallows manual inserts; BY DEFAULT allows manual ID insertion.Step 2: Match requirement to syntax
Since manual insertion is needed sometimes,GENERATED BY DEFAULT AS IDENTITYis the best choice.Final Answer:
INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY -> Option BQuick Check:
BY DEFAULT allows manual IDs, ALWAYS does not [OK]
- Choosing GENERATED ALWAYS which forbids manual IDs
- Using SERIAL which is less flexible
- Not using any auto-generation and risking duplicates
Ready to prove it?
Pass the test and this pattern moves unknown
