Ana içeriğe geç
Kesit SQL
İleri · Veritabanı Tasarımı

Görünümler ileri: güncellenebilir view, WITH CHECK OPTION, materialized view

Hangi view'a INSERT/UPDATE yapılabilir, veri hazır saklayan görünümler ve yenileme.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Güncellenebilir görünüm

Tek tabloya dayanan, GROUP BY / DISTINCT / toplama / pencere fonksiyonu içermeyen basit görünümler üzerinden INSERT, UPDATE ve DELETE yapılabilir; değişiklik alttaki tabloya yansır.

CREATE VIEW v_kitap AS
SELECT product_id, name, price, category
FROM products
WHERE category = 'Kitap';

UPDATE v_kitap SET price = price * 1.05;   -- products tablosundaki kitaplar güncellenir

WITH CHECK OPTION

Görünümün filtresine uymayan satırların görünüm üzerinden eklenmesini veya değiştirilmesini engeller:

CREATE VIEW v_kitap AS
SELECT product_id, name, price, category
FROM products
WHERE category = 'Kitap'
WITH CHECK OPTION;

-- Hata: satır görünümün dışına çıkardı
UPDATE v_kitap SET category = 'Elektronik' WHERE product_id = 9;

Oracle'da ayrıca WITH READ ONLY görünümü salt okunur yapar, CREATE FORCE VIEW tablo henüz yokken görünüm oluşturur.

Materialized view (somut görünüm)

Normal görünüm her sorguda yeniden hesaplanır. Materialized view sonucu diskte saklar; okunması hızlıdır ama veriler değiştikçe yenilenmesi gerekir.

SQL türüNasıl?
PostgreSQLCREATE MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW [CONCURRENTLY]
OracleCREATE MATERIALIZED VIEW ... REFRESH FAST|COMPLETE ON COMMIT|DEMAND, sorgu yeniden yazma (query rewrite)
SQL ServerIndexed view: WITH SCHEMABINDING ile görünüm + benzersiz kümelenmiş indeks; otomatik güncel tutulur
BigQuery, SnowflakeCREATE MATERIALIZED VIEW; artımlı ve otomatik yenileme
MySQLYok; özet tablo + zamanlanmış olay (EVENT) ile taklit edilir
-- PostgreSQL
CREATE MATERIALIZED VIEW mv_aylik_ciro AS
SELECT date_trunc('month', o.order_date) AS ay,
       SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
WHERE o.status = 'delivered'
GROUP BY 1;

CREATE UNIQUE INDEX ON mv_aylik_ciro (ay);
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_aylik_ciro;   -- okuyanları kilitlemeden yenile
Ne zaman?Pahalı ve sık okunan, ama birkaç dakika/saat eski olmasında sakınca olmayan raporlar için. Gerçek zamanlı doğruluk gereken yerde normal görünüm veya indeks tercih edilir.
Alıştırmalara geç (8)