Updatable views let you change data through a saved query, making it easier to work with complex data without touching the original tables directly.
You want to simplify data access for users by showing only certain columns or rows.
You need to allow users to update data safely without giving them full access to all tables.
You want to hide complex joins but still allow updates on the combined data.
You want to enforce some rules or filters on data updates automatically.
You want to present data in a specific way but keep it editable.
Syntax
PostgreSQL
CREATEVIEW view_name ASSELECT column1, column2, ...
FROM table_name
WHERE condition;
-- To make the view updatable, it must follow certain rules.-- You can also use INSTEAD OF triggers for complex views.
Not all views are updatable. Simple views on one table usually are.
For complex views, you can write INSTEAD OF triggers to handle updates.
Examples
This view shows only active employees. You can update the 'name' or 'active' fields through this view.
PostgreSQL
CREATEVIEW simple_view ASSELECT id, name FROM employees WHERE active = true;
This view limits data to the Sales department. Updates affect only those employees.
PostgreSQL
CREATEVIEW limited_view ASSELECT id, salary FROM employees WHERE department = 'Sales';
This view joins two tables. It is not automatically updatable without triggers.
PostgreSQL
CREATEVIEW complex_view ASSELECT e.id, e.name, d.name AS dept_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
Sample Program
This example creates a table and a view showing only active employees. It updates a name through the view and shows that inactive employees cannot be updated via the view.
PostgreSQL
CREATETABLE employees (
id SERIALPRIMARYKEY,
name TEXT,
active BOOLEAN,
department TEXT
);
INSERTINTO employees (name, active, department) VALUES
('Alice', true, 'Sales'),
('Bob', false, 'HR'),
('Carol', true, 'Sales');
CREATEVIEW active_employees ASSELECT id, name, department FROM employees WHERE active = true;
-- Update name of an active employee through the viewUPDATE active_employees SET name = 'Alicia'WHERE id = 1;
-- Try to update an inactive employee (won't affect anything)UPDATE active_employees SET name = 'Robert'WHERE id = 2;
-- Check the employees tableSELECT * FROM employees ORDERBY id;
OutputSuccess
Important Notes
Views that select from only one table without complex joins or aggregates are usually updatable.
If your view is complex, use INSTEAD OF triggers to define how inserts, updates, and deletes work.
Updating through views helps keep your data safe and your queries simple.
Summary
Updatable views let you change data through a saved query.
Simple views on one table are usually updatable automatically.
For complex views, use triggers to handle updates.
Practice
(1/5)
1. What is an updatable view in PostgreSQL?
easy
A. A function that returns a set of rows
B. A view that only shows data but cannot be changed
C. A table that stores data permanently
D. A view that allows you to change data in the underlying table through it
Solution
Step 1: Understand the definition of a view
A view is a saved query that shows data from one or more tables.
Step 2: Identify what makes a view updatable
An updatable view lets you change data in the underlying table by modifying the view.
Final Answer:
A view that allows you to change data in the underlying table through it -> Option D
Quick Check:
Updatable view = change data through view [OK]
Hint: Updatable views let you edit data through the view [OK]
Common Mistakes:
Confusing views with tables
Thinking all views are read-only
Believing views store data themselves
2. Which of the following is the correct syntax to create a simple updatable view on a single table employees showing id and name columns?
easy
A. CREATE VIEW emp_view AS SELECT id, name FROM employees;
B. CREATE VIEW emp_view AS UPDATE employees SET name = 'John';
C. CREATE TABLE emp_view AS SELECT id, name FROM employees;
D. CREATE FUNCTION emp_view() RETURNS TABLE(id INT, name TEXT) AS $$ SELECT id, name FROM employees; $$ LANGUAGE SQL;
Solution
Step 1: Recall the syntax to create a view
The syntax is CREATE VIEW view_name AS SELECT columns FROM table;
Step 2: Check each option
CREATE VIEW emp_view AS SELECT id, name FROM employees; matches the correct syntax for a simple view. The other options are incorrect because they use UPDATE, CREATE TABLE, or FUNCTION instead of CREATE VIEW.
Final Answer:
CREATE VIEW emp_view AS SELECT id, name FROM employees; -> Option A
Quick Check:
CREATE VIEW uses SELECT query [OK]
Hint: CREATE VIEW uses SELECT, not UPDATE or TABLE [OK]
Common Mistakes:
Using UPDATE instead of SELECT in CREATE VIEW
Confusing CREATE VIEW with CREATE TABLE
Trying to create a function instead of a view
3. Given the table products(id, name, price) and the view CREATE VIEW cheap_products AS SELECT id, name FROM products WHERE price < 100; What happens if you try to update the name of a product through cheap_products view?
medium
A. The update changes only the view but not the underlying table
B. The update fails because the view filters rows with a WHERE clause
C. The update succeeds and changes the product name in the products table
D. The update causes a syntax error
Solution
Step 1: Understand updatable views with WHERE clause
Views that select from a single base table with a restricting WHERE clause are updatable in PostgreSQL.
Step 2: Check the effect of updating through filtered view
Updating the name of a product visible in the view (price < 100) will successfully update the underlying products table.
Final Answer:
The update succeeds and changes the product name in the products table -> Option C
Quick Check:
Single-table views with WHERE are updatable [OK]
Hint: Single-table views with WHERE filters are updatable [OK]
Common Mistakes:
Thinking WHERE clause prevents updates
Thinking update affects only the view
Expecting syntax error instead of runtime error
4. You created a view with this SQL: CREATE VIEW emp_dept AS SELECT e.id, e.name, d.name AS dept_name FROM employees e JOIN departments d ON e.dept_id = d.id; When you try to update emp_dept to change an employee's name, you get an error. What is the main reason?
medium
A. The view joins multiple tables, so it is not automatically updatable
B. The view does not include the employee's ID column
C. The view uses aliases for columns, causing syntax errors
D. The view is missing a WHERE clause
Solution
Step 1: Analyze the view definition
The view joins two tables: employees and departments.
Step 2: Understand updatable view rules for joins
Views that join multiple tables are not automatically updatable in PostgreSQL because the system cannot decide how to update multiple tables from one view.
Final Answer:
The view joins multiple tables, so it is not automatically updatable -> Option A
Quick Check:
Joined views are not updatable by default [OK]
Hint: Views with joins are not updatable automatically [OK]
Common Mistakes:
Thinking missing ID causes update failure
Blaming column aliases for errors
Assuming WHERE clause is required for updates
5. You want to make a complex view updatable that joins orders and customers tables. Which PostgreSQL feature should you use to allow updates through this view?
hard
A. Use a materialized view instead of a regular view
B. Create INSTEAD OF triggers on the view to handle updates
C. Add a WHERE clause to the view to filter rows
D. Create a function that returns the joined data
Solution
Step 1: Understand limitations of updatable views with joins
Views joining multiple tables are not automatically updatable in PostgreSQL.
Step 2: Use INSTEAD OF triggers to enable updates
INSTEAD OF triggers let you define custom update logic on complex views, making them updatable.
Final Answer:
Create INSTEAD OF triggers on the view to handle updates -> Option B
Quick Check:
INSTEAD OF triggers enable updates on complex views [OK]
Hint: Use INSTEAD OF triggers for complex view updates [OK]
Common Mistakes:
Thinking WHERE clause makes view updatable
Confusing materialized views with updatable views
Believing functions replace update triggers
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.