- I'm trying to create a non-updatable view in PostgreSQL but every view I've created is continue updating after inserting some data in tables. What am I doing wrong?
- What is the difference between materialized view and an updatable view?
- How can I quickly check if the view is updatable or not?
Here are I tried to create three types of views:
-- Updatable view
CREATE VIEW vip_tickets_for_events AS
SELECT events.id, events.name, COUNT(tickets.id) as vip_tickets_num FROM events
JOIN tickets on events.id = tickets.event_id
WHERE tickets.type = 'VIP'
GROUP BY events.id, events.name;
-- Non-updatable view
CREATE VIEW tickets_for_events AS
SELECT vip_tickets.name, vip_tickets.vip_tickets_num, general_tickets.general_tickets_num
FROM (SELECT events.name, COUNT(tickets.id) as vip_tickets_num FROM events
JOIN tickets on events.id = tickets.event_id
WHERE tickets.type = 'VIP'
GROUP BY events.name) AS vip_tickets
JOIN
(SELECT events.name, COUNT(tickets.id) as general_tickets_num FROM events
JOIN tickets on events.id = tickets.event_id
WHERE tickets.type = 'General'
GROUP BY events.name) AS general_tickets
ON vip_tickets.name = general_tickets.name;
-- Materialized view
CREATE MATERIALIZED VIEW average_ticket_prices_for_events AS
SELECT events.id, events.name, AVG(tickets.price) as average_price FROM events
JOIN tickets on events.id = tickets.event_id
GROUP BY events.id, events.name;