8 Olemasoleva tabeli muutmine
Oleme varasemalt õppinud tabelite kustutamist juhuks, kui tabeli loomisel midagi valesti läheb. Nüüd, kui me oleme õppinud ka tabelitesse andmete lisamist, ei soovi me edaspidi tabeleid lihtsalt ära kustutada iga kord, kui mõni viga ilmneb, sest tabeli kustutamisel kustutatakse ära ka kõik selles olevad andmed.
Mida siis aga ikkagi teha, kui me märkame, et näiteks mõni veerg on valesti nimetatud või kui mõni kitsendus on jäänud lisamata? Sellisteks juhtudeks on olemas SQL laused erinevateks nimemuutusteks ning struktuurimuutusteks. Käesolevas peatükis vaatamegi, millised on erinevad võimalikud nime- ja struktuurimuutused. Samuti tutvume tabelis olevate kirjete muutmise ning kustutamisega.
Nimemuutused
Nimemuutuste alla käib tabeli nime muutmine, veeru nime muutmine ning ka kitsenduse nime muutmine.
Üldjuhul on nimemuutusi vaja sisse viia juhul, kui tabeli, veeru või kitsenduse nimi ei tõlgenda meie andmeid korrektselt. Näiteks võib ette tulla olukord, kus me oleme loonud tabeli Toode ning lisanud sinna veeru nimega pikkus. Veeru nimi pikkus ei anna meile aga mingit informatsiooni selle kohta, mis ühikutes toote pikkus on, samas veeru nimi pikkus_cm kirjeldaks kohe, et pikkus on sentimeetrites. Nimemuutuste jaoks võib esineda vajadus ka siis, kui me oleme tabelit luues mõne nime lihtsalt valesti kirjutanud. Lisaks eelnevale võb ilmneda vajadus nimemuutusteks erinevate ühiskonna muutuste tõttu. Näiteks kui Eesti taasiseseisvus, muudeti haldusüksuste nimesid – nõukogude ajal kasutuses oleva mõiste rajoon asemele tuli maakond ning külanõukogu nimetati ümber vallaks.
Selleks, et muuta tabeli nime, on olemas SQL lause kujul:
ALTER TABLE <tabeli vana nimi> RENAME TO <tabeli uus nimi>;
Kui me soovime aga muuta veeru nime, tuleb kasutada SQL lauset kujul:
ALTER TABLE <tabeli nimi> RENAME COLUMN <vana veeru nimi> TO <uus veeru nimi>;
Sarnaselt veeru nime muutmisele on kitsenduse nime muutmiseks SQL lause kujul:
ALTER TABLE <tabeli nimi> RENAME CONSTRAINT <vana kitsenduse nimi> TO <uus kitsenduse nimi>;
Struktuurimuutused
Struktuurimuutuste alla käib nii veergude kui ka tabeli kitsenduste lisamine ning kustutamine. Samuti saab struktuurimuutuste abil muuta olemasoleva veeru definitsiooni.
Selleks, et lisada tabelisse uus veerg, saab kasutada SQL lauset kujul:
-
ALTER TABLE <tabeli nimi> ADD COLUMN <veeru definitsioon>;
Tabeli kitsenduse lisamiseks saame me kasutada SQL lauset kujul:
ALTER TABLE <tabeli nimi> ADD CONSTRAINT <kitsenduse nimi> <tabeli kitsendus>;
Seda, millised nägid välja veeru definitsioonid on võimalik meelde tuletada siit peatükist ning seda, millised nägid välja erinevad tabeli kitsendused, saab meenutada siit.
Selleks, et veergu või tabeli kitsendust kustutada, on SQL laused kujul:
ALTER TABLE <tabeli nimi>
DROP COLUMN
<kustutatava veeru nimi>;
ALTER TABLE <tabeli nimi> DROP CONSTRAINT <kustutatava kitsenduse nimi>;
Nagu varasemalt mainitud sai, siis lisaks veergude ning tabeli kitsenduste lisamisele ja kustutamisele on võimalik muuta ka tabelis olemasoleva veeru definitsiooni. Vajadus selleks ilmneb näiteks siis, kui tunnuse andmetüüp on algselt valesti määratud. Veeru definitsiooni muutmiseks tuleks läbida järgnevad sammud:
- Lisame olemasolevasse tabelisse uue veeru, mille loomisel kasutame uut muudatustega veeru definitsiooni. Selleks kasutame SQL lauset:
ALTER TABLE <tabeli nimi> ADD COLUMN <uue veeru definitsioon>;
- Kanname sinna vanas veerus olnud andmed üle lausega:
UPDATE <tabeli nimi> SET <uue veeru nimi> = <vana veeru nimi>;
- Kustutame vana veeru järgneva SQL lausega:
ALTER TABLE <tabeli nimi> DROP COLUMN <vana veeru nimi>;
- Muudame uue veeru nime vanaks tagasi lausega:
ALTER TABLE <tabeli nimi> RENAME COLUMN <uue veeru nimi>
TO
<vana veeru nimi>;
Näiteks kui me soovime tabelis Inimesed muuta veeru eesnimi andmetüübiks varchar (70), peame me käivitama järgnevaid SQL lauseid:
ALTER TABLE Inimesed
ADD COLUMN
eesnimi_muudatustega
VARCHAR (70)
;
UPDATE Inimesed SET eesnimi_muudatustega = eesnimi;
ALTER TABLE Inimesed DROP COLUMN eesnimi;
ALTER TABLE Inimesed RENAME COLUMN eesnimi_muudatustega TO eesnimi;
NB! Kui sa muutsid enne ülesande käigus tabeli Inimesed nime, pead sa neid SQL lauseid jooksutades kasutama tabeli nime Inimesed asemel Inimesed2 või siis muutma tabeli nimeks jälle Inimesed, et sa saaksid ka edasisi näiteid läbida.
Kõik need neli sammu on olulised sellepärast, et veeru definitsiooni muutmisel ei läheks meil tabelis olemasolevad andmed kaotsi. Kui me lihtsalt kustutaks vana veeru ning lisaks uue definitsiooniga veeru asemele, kustuks kõik vanas veerus olnud andmed. Teise sammu käigus me aga kopeerime andmed vanast veerust ka uude veergu, mistõttu vana veeru kustutamisel andmed siiski säilivad uues veerus.
Et veeru andmetüüpi saab muuta vaid veeru definitsiooni muutes ning veeru definitsiooni muutmine on struktuurimuutustest kõige keerulisem, tulekski alati tabelit luues tunnuste andmetüübid hoolikalt läbi mõelda ja paika panna, et hiljem seda keerulist protsessi vältida.
Lisaks veeru definitsiooni muutmisele on võimalik läbi viia ka järgnevaid muudatusi:
- Veerule algväärtuse andmine:
ALTER TABLE <tabeli nimi> ALTER COLUMN <veeru nimi>
SET DEFAULT
<vaikeväärtus>;
- Veerule antud algväärtuse kustutamine:
ALTER TABLE <tabeli nimi> ALTER COLUMN <veeru nimi> DROP DEFAULT;
- Veerule kitsenduse NOT NULL lisamine:
ALTER TABLE <tabeli nimi> ALTER COLUMN <veeru nimi>
SET
NOT NULL;
- Veerult kitsenduse NOT NULL kustutamine:
ALTER TABLE <tabeli nimi> ALTER COLUMN <veeru nimi>
DROP
NOT NULL;
Kirjete muutmine ning kustutamine
Vahel on vajadus ka vigaseid andmeid muuta või kustutada. Selleks, et muuta olemasolevat kirjet, tuleb kasutada SQL lauset kujul:
UPDATE <tabeli nimi> SET <veeru nimi> = <uus väärtus> WHERE <tingimus>;
Selle SQL lause abil otsitakse üles kõik kirjed, mis rahuldavad etteantud tingimust ning seejärel muudetakse leitud kirjete nimetatud veeru väärtused etteantud uueks väärtuseks. Näiteks kui me soovime muuta tabelis Inimesed kõigi isikute eesnimeks ‘Liisa’, kelle eesnimeks on hetkel ‘Mari’, peaksime jooksutama SQL lauset:
UPDATE Inimesed
SET
eesnimi = 'Liisa' WHERE eesnimi = 'Mari';
Kui me aga soovime kustutada tabelis olevat kirjet, saame kasutada SQL lauset kujul:
DELETE FROM <tabeli nimi> WHERE <tingimus>;
Ehk kui me nüüd sooviks hoopis kustutada kõik isikud tabelist Inimesed, kelle eesnimeks on ‘Liisa’, peaksime me jooksutama SQL lauset:
DELETE FROM Inimesed WHERE eesnimi = 'Liisa';
Kui aga peaks ilmnema vajadus kustutada tabelist kõik andmed, saab kasutada SQL lauset kujul:
DELETE DROM <tabeli nimi>;
See SQL lause kustutab tabelist kõik kirjed, sest me jätsime tingimuse täpsustamata. Kuna me tingimust ei täpsustanud, kuuluvad kõik tabelis olevad kirjed tulemi hulka ehk need kõik kustutatakse.