Serial and identity columns help automatically create unique numbers for new rows. This makes it easy to give each row a special ID without typing it yourself.
Serial and identity columns in PostgreSQL
CREATE TABLE table_name ( column_name SERIAL PRIMARY KEY ); -- or using identity columns (PostgreSQL 10+) CREATE TABLE table_name ( column_name INT GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY PRIMARY KEY );
SERIAL is a shortcut that creates an integer column and a sequence to auto-increment values.
IDENTITY columns are the SQL standard way and give more control over how numbers are generated.
id column using SERIAL.CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT );
order_id.CREATE TABLE orders ( order_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, product_name TEXT );
product_id is auto-generated but you can also insert your own number if needed.CREATE TABLE products ( product_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, product_name TEXT );
This example creates an employees table with a SERIAL column for employee_id. It inserts two employees and shows their IDs automatically assigned.
CREATE TABLE employees ( employee_id SERIAL PRIMARY KEY, employee_name TEXT ); INSERT INTO employees (employee_name) VALUES ('Alice'); INSERT INTO employees (employee_name) VALUES ('Bob'); SELECT * FROM employees ORDER BY employee_id;
SERIAL is easy to use but is PostgreSQL-specific.
IDENTITY columns follow the SQL standard and are recommended for new projects.
Always use PRIMARY KEY with these columns to ensure uniqueness.
Serial and identity columns automatically create unique numbers for new rows.
SERIAL is a quick PostgreSQL shortcut; IDENTITY is the standard and more flexible.
Use them to avoid manual ID entry and prevent duplicates.
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
