Using DEFAULT Values and Expressions in PostgreSQL
📖 Scenario: You are creating a simple database table to store information about books in a library. Some columns should have default values to simplify data entry and ensure consistency.
🎯 Goal: Create a table called books with columns that use DEFAULT values and expressions to automatically fill in missing data.
📋 What You'll Learn
Create a table named books with columns id, title, author, copies, and added_date.
Set id as a primary key with automatic increment.
Set copies to have a default value of 1.
Set added_date to have a default value of the current date.
Insert a row without specifying copies and added_date to see defaults in action.
💡 Why This Matters
🌍 Real World
DEFAULT values help reduce errors and simplify data entry in real databases by automatically filling in common or expected values.
💼 Career
Understanding DEFAULT values is essential for database design and maintenance roles, ensuring data consistency and efficient workflows.
Progress0 / 4 steps
1
Create the books table with basic columns
Write a SQL statement to create a table called books with columns: id as an integer primary key with auto-increment, title as text, and author as text.
PostgreSQL
Hint
Use SERIAL PRIMARY KEY for auto-incrementing id.
2
Add columns with DEFAULT values
Alter the books table creation SQL to add a column copies as integer with a default value of 1, and a column added_date as date with a default value of the current date using CURRENT_DATE.
PostgreSQL
Hint
Use DEFAULT 1 for copies and DEFAULT CURRENT_DATE for added_date.
3
Insert a book without specifying copies and added_date
Write an INSERT statement to add a book with title 'The Great Gatsby' and author 'F. Scott Fitzgerald' without specifying copies or added_date.
PostgreSQL
Hint
Only specify title and author in the INSERT statement.
4
Verify the default values are applied
Write a SELECT statement to retrieve all columns from the books table to check that copies is 1 and added_date is set to the current date for the inserted book.
PostgreSQL
Hint
Use SELECT * FROM books to see all columns and verify defaults.
Practice
(1/5)
1. What does the DEFAULT keyword do in a PostgreSQL table column definition?
easy
A. Sets a value automatically when no value is provided during insert
B. Deletes the column if no value is provided
C. Requires the user to always provide a value
D. Creates an index on the column
Solution
Step 1: Understand the purpose of DEFAULT
The DEFAULT keyword assigns a value automatically if no value is given during an insert operation.
Step 2: Compare options with this behavior
Only Sets a value automatically when no value is provided during insert correctly describes this automatic assignment behavior.
Final Answer:
Sets a value automatically when no value is provided during insert -> Option A
Hint: Defaults fill missing columns, provided values override [OK]
Common Mistakes:
Assuming missing columns become NULL instead of default
Expecting error when default exists
Confusing default value with NOT NULL constraint
4. Consider this table:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
Which of the following INSERT statements will cause an error?
medium
A. INSERT INTO users (id, username, created_at) VALUES (DEFAULT, 'alice', DEFAULT);
B. INSERT INTO users (username, created_at) VALUES ('bob', DEFAULT);
C. INSERT INTO users (username) VALUES ('alice');
D. INSERT INTO users (created_at) VALUES (NOW());
Solution
Step 1: Check NOT NULL column requirements
The username column is NOT NULL and must be provided in inserts.
Step 2: Analyze each insert
INSERT INTO users (created_at) VALUES (NOW()); inserts only created_at but omits username, causing a NOT NULL violation error.
Final Answer:
INSERT INTO users (created_at) VALUES (NOW()); -> Option D
Quick Check:
NOT NULL columns must be provided [OK]
Hint: NOT NULL columns require values, even with defaults [OK]
Common Mistakes:
Assuming DEFAULT VALUES inserts NULL for NOT NULL columns
Thinking DEFAULT can replace NOT NULL columns
Ignoring NOT NULL constraints
5. You want to create a table products where the created_at column defaults to the current timestamp, and the price column defaults to 9.99 if no price is given. Which of the following CREATE TABLE statements correctly implements this?
hard
A. CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT 9.99,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
);
B. CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT 9.99,
created_at TIMESTAMP DEFAULT NOW()
);
C. CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT '9.99',
created_at TIMESTAMP DEFAULT NOW
);
D. CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT 9.99,
created_at TIMESTAMP DEFAULT CURRENT_DATE
);
Solution
Step 1: Check default for price column
Price should default to numeric 9.99 without quotes (numeric literal).
Step 2: Check default for created_at column
Use NOW() function call for current timestamp, not CURRENT_TIMESTAMP or CURRENT_DATE (date only).
Step 3: Validate syntax correctness
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT 9.99,
created_at TIMESTAMP DEFAULT NOW()
); uses price NUMERIC DEFAULT 9.99 and created_at TIMESTAMP DEFAULT NOW(), which is correct syntax and behavior.
Final Answer:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC DEFAULT 9.99,
created_at TIMESTAMP DEFAULT NOW()
); -> Option B
Quick Check:
Use NOW() for timestamp, numeric literals without quotes [OK]
Hint: Use NOW() for timestamp defaults, numeric literals without quotes [OK]
Common Mistakes:
Using quotes around numeric default values
Using CURRENT_DATE instead of CURRENT_TIMESTAMP for timestamps
Omitting parentheses in NOW() function
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.