What if your database could do math for you perfectly every time, without you lifting a finger?
Why GENERATED columns (stored and virtual) in PostgreSQL? - Purpose & Use Cases
Imagine you have a spreadsheet where you must calculate a total price by multiplying quantity and unit price for hundreds of rows. You do this manually each time you add or change data.
Manually updating calculated values is slow and easy to forget. Mistakes happen, and your totals might be wrong. It's hard to keep data consistent and reliable.
GENERATED columns automatically calculate values based on other columns. Stored columns save the result physically, while virtual columns compute on the fly. This keeps data accurate without extra work.
UPDATE orders SET total_price = quantity * unit_price;
CREATE TABLE orders (quantity INT, unit_price NUMERIC, total_price NUMERIC GENERATED ALWAYS AS (quantity * unit_price) STORED);
You can trust your data is always correct and save time by letting the database handle calculations automatically.
An online store uses GENERATED columns to keep track of order totals, taxes, and discounts without manual updates, ensuring accurate billing every time.
Manual calculations are error-prone and slow.
GENERATED columns automate and guarantee correct computed data.
Stored columns save results; virtual columns compute when needed.
Practice
Solution
Step 1: Understand GENERATED column concept
A GENERATED column automatically computes its value based on other columns in the same row.Step 2: Compare options with definition
Only A column that automatically calculates its value from other columns describes this automatic calculation feature correctly.Final Answer:
A column that automatically calculates its value from other columns -> Option BQuick Check:
GENERATED column = auto-calculated column [OK]
- Thinking GENERATED columns store manual input
- Confusing GENERATED with regular stored columns
- Assuming GENERATED columns only store text
Solution
Step 1: Recall PostgreSQL syntax for STORED GENERATED columns
PostgreSQL uses 'GENERATED ALWAYS AS (expression) STORED' to define such columns.Step 2: Check each option
CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a * 2) STORED); matches the correct syntax. CREATE TABLE t (a INT, b INT AS (a * 2)); misses 'GENERATED ALWAYS' and 'STORED'. CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a * 2) VIRTUAL); uses 'VIRTUAL' which PostgreSQL does not support. CREATE TABLE t (a INT, b INT COMPUTED AS (a * 2)); uses 'COMPUTED' which is invalid in PostgreSQL.Final Answer:
CREATE TABLE t (a INT, b INT GENERATED ALWAYS AS (a * 2) STORED); -> Option AQuick Check:
PostgreSQL STORED syntax = GENERATED ALWAYS AS (...) STORED [OK]
- Using VIRTUAL keyword which PostgreSQL does not support
- Omitting GENERATED ALWAYS clause
- Using COMPUTED instead of GENERATED
CREATE TABLE sales ( price NUMERIC, quantity INT, total NUMERIC GENERATED ALWAYS AS (price * quantity) STORED );
What will be the result of:
INSERT INTO sales (price, quantity) VALUES (10, 3); SELECT total FROM sales;
Solution
Step 1: Understand the GENERATED column calculation
The 'total' column is calculated as price * quantity, so 10 * 3 = 30.Step 2: Check the INSERT and SELECT results
After inserting (10, 3), selecting 'total' returns 30 as the stored generated value.Final Answer:
[30] -> Option DQuick Check:
price * quantity = 10 * 3 = 30 [OK]
- Expecting manual input for generated column
- Confusing addition with multiplication
- Thinking generated columns can be NULL after insert
CREATE TABLE products ( price NUMERIC, discount NUMERIC, final_price NUMERIC GENERATED ALWAYS AS (price - discount) );
What is wrong with this statement?
Solution
Step 1: Check PostgreSQL GENERATED column syntax
PostgreSQL requires the STORED keyword for generated columns; omitting it causes an error.Step 2: Analyze the given statement
The statement misses 'STORED' after the expression, so it is invalid syntax.Final Answer:
Missing STORED keyword for the GENERATED column -> Option CQuick Check:
GENERATED columns must include STORED in PostgreSQL [OK]
- Assuming VIRTUAL columns are supported
- Thinking arithmetic is not allowed
- Believing data types must be integers
first_name, last_name, and a generated column full_name that combines both names separated by a space. Which is the correct way to define full_name in PostgreSQL?Solution
Step 1: Use correct string concatenation operator in PostgreSQL
PostgreSQL uses '||' to concatenate strings, not '+'.Step 2: Use correct GENERATED column syntax
PostgreSQL requires 'GENERATED ALWAYS AS (expression) STORED' for generated columns; VIRTUAL and COMPUTED are invalid.Final Answer:
full_name TEXT GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED -> Option AQuick Check:
String concat with || and STORED keyword [OK]
- Using + instead of || for string concatenation
- Using VIRTUAL or COMPUTED keywords
- Omitting STORED keyword
Ready to prove it?
Pass the test and this pattern moves unknown
