Vaadete muutmine ja vaate kaudu põhitabeli andmete muutmine
Vaate muutmine
Vaadet saab ka mingil määral muuta. Lause:
CREATE [ OR REPLACE ] VIEW vaate_nimi AS (SELECT lause);
OR REPLACE
selles lauses loob või uuendab olemasoleva vaadet. Kui olemasolevat vaadet uuendatakse, siis uue vaate päringus peavad sisalduma eelmise vaate päringu väljad samas järjekorras. Uusi väljasid tohib lisada lõppu.
Uuendame eelnevalt loodud vaadet v_isikudklubid lisades ränkingu.
CREATE OR REPLACE VIEW v_isikudklubid(isik_nimi, isik_id, synniaeg, klubi_nimi, klubi_id, ranking) AS SELECT isikud.perenimi || ', ' || isikud.eesnimi, isikud.id, synniaeg, klubid.nimi, klubid.id, ranking FROM isikud JOIN klubid ON isikud.klubis = klubid.id;
Kontrollime, kas päringu muudatus õnnestus. Võime kohe pärida vaadet või DBeaveri kaudu vaadata detailsemat informatsiooni päringu kohta. Samas paneme tähele, et kuigi lisatud ranking oleks sobinud enam kas pärast isiku nime või isiku id'd, siis sinna me seda lisada ei saanud, sest lisada saab uusi välju ainult lõppu.
Vaate uuendamisel aga ei saa kustutada mõnda eelnevalt vaate päringus kasutatud veergu!
Saab kasutada ka lauset
ALTER VIEW — vaate muutmine
Siiski ka sellega on piiratud võimalused. Saame lisada vaikeväärtust veerule või veergu ümber nimetada. Viimasel juhul peab eelnevalt veenduma, et seda vaadet ei kasuta mõni teine vaade või rakendus, kus need veergude nimed on päringulauses!
Näiteks nimetame loodud vaates ranking veeru ümber elo'ks. NB! Nagu öeldud, kui seda vaate veergu on kasutatud mõnes päringus või teises vaates, peame ka seal hiljem vastava muudatuse tegema!
ALTER VIEW v_isikudklubid RENAME ranking TO elo;
Vaadet saab kustutada DROP VIEW <vaate_nimi>
.
Seega kui me soovime kustutada mõnda veergu vaatest, siis algselt peame kustutama kogu vaate ning siis looma uuesti selle juba vähemate veergudega.
Vaate kaudu põhitabeli andmete sisestamine, uuendamine ja kustutamine
Kuigi põhiliselt kasutatakse vaadet ikkagi päringutes, siis teatud tingimustel saab läbi vaate baastabelisse andmeid lisada, muuta ja kustutada. Vaade, mille kaudu saab baastabelisse andmeid sisestada, muuta ja kustutada peab olema loodud nii, et:
- vaates kasutatavas
SELECT
lauseFROM
osas on ainult üks tabel (või üks vaade); SELECT
lauses ei ole kasutatud meile teadaolevatestGROUP BY
,HAVING
,LIMIT
,DISTINCT
,UNION
,INTERSECT
egaEXCEPT
;SELECT
lauses ei ole kasutatud agregeerivaid funktsioone (näiteksSUM
,COUNT
jms);- ei ole kasutatud alampäringuid ja erinevaid
OUTER JOIN
’i.
Erinevatel andmebaasi juhtimissüsteemidel on need tingumused ka veidi erinevad.
Soovitav on kasutada vaadete puhul, mille kaudu baastabelite andmeid saab muuta või sisestada WITH CHECK OPTION
kitsendust. Näiteks loome vaate v_knimed
, millesse võtame isikud, kelle puhul nii ees- kui ka perenimi algab K-tähega:
CREATE VIEW v_knimed AS SELECT eesnimi, perenimi FROM isikud WHERE eesnimi LIKE 'K%' AND perenimi LIKE 'K%' WITH CHECK OPTION;
Lisame selle vaate kaudu tabelisse Isikud
isiku nimega Kalle Kusta.
INSERT INTO v_knimed (eesnimi, perenimi) VALUES ('Kalle', 'Kusta');
Võite kontrollida päringuga tabelist isikud, kas vastav kirje on olemas.
Tahame aga lisada ka Mari Maasika.
INSERT INTO v_knimed (eesnimi, perenimi) VALUES ('Mari', 'Maasikas');
Siis sellisel juhul saame veateate:
Ehk siis kuna meie poolt soovitav kirje Mari Maasikas
ei vasta vaate tingimustele (ees- ja perenimi ei alga K-tähega), siis lisamist ei teostada. Kui me poleks vaate loomisel lisanud lõppu kitsenduse WITH CHECK OPTION
, oleks saanud vabalt ka Mari Maasika vaate kaudu lisada.
Miks seda vaja on? Näiteks on meil korterite andmebaas. Igal korteri omanikul peab olema luba lisada oma korterisse elanikke (saab vaate kaudu). Samas ei tohi keegi ju lisada elanikke naaberkorterisse.
Läbi vaate saab ka kirjeid uuendada ning kustutada. Uuendame kirjet vaate kaudu:
UPDATE v_knimed SET eesnimi = 'Kalle Kalvi' WHERE eesnimi='Kalle' AND perenimi='Kusta';
Samamoodi kuna meil on vaatel v_knimed kitsendus peal, siis ei saaks me muuta Kalle Kusta nime aga näiteks Malle Kustaks või Kalle Maasikaks.
Kirje kustamisel vaate kaudu:
DELETE FROM v_knimed WHERE eesnimi='Kalle Kalvi' AND perenimi='Kusta';
Kontrollimaks, kas said vaate teemast aru ava soovi korral test.
AVA TEST
Vaadete loomine | Funktsioonide loomine |