|
SQL - Structured Query Language - II
Līdzās SQL "absolūtajam minimumam", ko aplūkojām
iepriekšējā dokumentā, ir vēl vairākas
ļoti noderīgas komandas.
Webkursu veidotāji izsaka pateicību Gunāram Rodinam, kurš palīdzējis šī
materiāla tapšanā.
Šajā dokumentā aplūkosim sekojošas komandas: Komanda
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| NPK | CILVEKS | ADRESE |
|---|---|---|
| 1 | Miki Mausis | Latvija, Rīga, Kino iela 1-1 |
| 2 | Donalds Daks | Latvija, Rīga, Kino iela 1-1 |
Daudzi pie šāda sadalījuma arī apstājas un smalkāk šo informāciju nedala. Starp citu, parasti šo pirmatnējo sadalījumu izmanto, lai veidotu tabulu nosaukumus un satura skices (tas ir lai izdomātu kādas tabulas ko glabās), mūsu gadījumā ir viegli redzams, ka būs divas tabulas - viena par personu un otra par adresi. Šīs informācijas vienības viegli dalās apakšlīmeņos, jo tā ir pēc būtības strukturēta informācija. Mūsu mērķis ir izveidot pēc iespējams strukurētāku informācijas loģisko sadalījumu. No augstāk minētās informācijas mēs iegūstam sekojošu struktūras detalizāciju.
| ID_CILVEKS | UZVARDS | VARDS | VALSTS | PAGASTS/PILSETA | IELA | NR_DZ |
|---|---|---|---|---|---|---|
| 1 | Miki | Mausis | Latvija | Rīga | Kino | 1-1 |
| 2 | Donalds | Daks | Latvija | Rīga | Kino | 1-1 |
No šīs iegūtās sadalījuma informācijas redzams, ka abām minētajām personām ir vienādas adreses. Tātad viena adrese uz 2 personām (to sauc par 1-N (lasās viens pret N) saiti). Tātad sasaiti veidojam tā , ka cilvēkam noteikti ir adrese, nevis adresei ir noteikti viens cilvēks. (Adrese var eksistēt arī bez tā ka tur kāds ir pierakstīts - neapdzīvota platība). Tātad taisam divas tabulas, kur cilvēks ir piesaistīts adresei:
Tabula: cilveks |
|
| ID_CILVEKS | INT NOT NULL |
| VARDS | CHAR(30) NOT NULL |
| UZVARDS | CHAR(30) NOT NULL |
| ID_ADRESE | INT NOT NULL DEFAULT -1 |
Jūs jautāsiet, kāpēc pie lauka ID_ADRESE ir noklusētā vērtība "-1".
Tas tiek darīts tādēļ, lai paredzētu gadījumu,
kad mēs nezinām konkrētu adresi kur pierakstīts cilvēks,
bet piesaistītam viņam jābūt pēc atrunas.
Tāpēc veidojot visus klasifikatorus (tabulas),
tajos ieliek aizpildītu ierakstu ar indeksu -1.
Teiksim jūs izveidotjat ierakstu par cilvēku,
bet konkrētu adresi izvēlaties kaut kad vēlāk,
kad adrese ir ievadīta vai arī noskaidrota ir cilvēka pieraksta vieta.
Tabula: adrese |
|
| ID_ADRESE | INT NOT NULL |
| VALSTS | CHAR(50) NOT NULL |
| PILSETA | CHAR(50) NOT NULL |
| IELA | CHAR(50) NOT NULL |
| NR_DZ | CHAR(10) NOT NULL |
Protams, normāli būtu, ka mēs turpinātu strukturēt informāciju, un teiksim izveidotu atseviški klasifikatorus (citas tabulas) priekš Valstu, Pilsētu, Ielu uzglabāšanas, lai ar šī informācija gan ir apjomīga, toties bieži atkārtojas. (Bet to mēs nedarīsim, jo esmu par slinku! :-) SQL skripts šīm tabulām izskatītos sekojoši:
DROP TABLE IF EXISTS cilveks,adrese;
CREATE TABLE adrese (
id_adrese INT NOT NULL,
valsts CHAR(50) NOT NULL,
pilseta CHAR(50) NOT NULL,
iela CHAR(50) NOT NULL,
nr_dz CHAR(10),
PRIMARY KEY (id_adrese));
CREATE TABLE cilveks (
id_cilveks INT NOT NULL,
vards CHAR(30) NOT NULL,
uzvards CHAR(30) NOT NULL,
id_adrese INT REFERENCES adrese.id_adrese);
INSERT INTO adrese (id_adrese,valsts,pilseta,iela,nr_dz)
VALUES (1,"Latvija","Rīga","Kīno","1-1");
INSERT INTO cilveks (id_cilveks,vards,uzvards,id_adrese)
VALUES (1,"Miki","Mausis",1);
INSERT INTO cilveks (id_cilveks,vards,uzvards,id_adrese)
VALUES (2,"Donalds","Daks",1);
CREATE INDEX syntax.
ALTER TABLEALTER TABLE nodrošina esošo tabulu modificēšanu,
tas ir pielikt, izmest laukus un ideksus,
kā arī pamainīt visādus parametrus laukiem un indeksiem, kaut vai
lauku nosaukumus. Var arī mainīt pašas tabulas nosaukumu, piemēram:
ALTER TABLE cilveks RENAME persona;
Vai, teiksim, nomainīt kādu lauku garumus
(MODIFY maina parametrus nemainot nosaukumu,
bet CHANGE maina lauka nosaukumu un reizē parametrus):
ALTER TABLE persona MODIFY vards CHAR(50) NOT NULL, CHANGE uzvards uzv CHAR(50) NOT NULL;
Lai varētu izmantot komandu ALTER TABLE,
jums jābūt select, insert, delete, update, create, drop tiesībām.
Parastie lietotāji izmanto ārkārtīgi reti,
to parasti dara (tas atļauts) tikai datubāzu administrātoram,
jo šīs strukturālās izmaiņas izraisīt datubāzes nobrukšanu,
datu pazušanu vai sabojāšanos.
Šādas izmaiņas, pirms tās tiek veiktas,
rūpīgi analizē un apzina visas iespējamās problēmas,
kas saistās ar šīm izmaiņām.
Dažām datubāzēm ir iespaidīga papildiespēja (feature) - trigeri, tās ir SQL valodā rakstītas procedūras, kas glabājas uz SQL servera, un ko piesaista kaut kādiem notikumiem. Piemēram pie datu noglabāšanas, reģistrēt izmaiņas, kā arī tā datumu, laiku un lietotāju kas to veicis. Trigerus apšmaukt nevar, tāpēc tie ir ļoti labs mehānisms. Bet ja ir izmainīts kāds reģistrācijas lauka nosaukums vai tips, tad trigeris nespēj normāli bez modifikācijām strādāt radot milzu problēmas. Tāpēc ar datubāzes struktūrām parasti spēlējas tikai viens cilvēks - datubāzes administators.
ALTER TABLE citas iespējas un parametrus sk. MySQL dokumentācijā
ALTER TABLE syntax.
DROP TABLE
DROP TABLE komanda ir paredzēta esošo tabulu iznīcināšanai.
Iznīcinot tabulu, iznīcinās arī visi dati kas tajā glabājās.
Komanda ir pati vienkāršākā un
VISBĪSTAMĀKĀ SQL valodā,
bet par laimi šī komanda parasti atļauta tikai datubāzes administratoram.
Tās sintakse ir šāda:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
Opcija IF EXISTS bieži lieto,
jo, ja kāda tabula no esošā saraksta neeksistē, tad SQL serveris
neapstāsies ar kļūdas paziņojumu bet izmetīs tās tabulas, kuras eksistē,
pretējā gadījumā visa komandas darbība tiek apurēta.
Tā kā šo komandu parasti lieto administrēšanas skriptos/procedūrās/funkcijās,
un ja kāda šī komanda nenostrādā,
visa skripta/procedūras/funkcijas darbība tiek pārtraukta. Piemērs:
DROP TABLE IF EXISTS cilveks,adrese
Tāpat kā ar delete komandu, jums var rasties problēmas
izdzēst tabulu dēļ indeksiem, ja uz kādu šīs tabulas lauku
ir atsauce citā tabulā vai ierakstā (INDEXi),
jums SQL serveris izdos kļūdu.
Mūsu piemērā par cilvēku un adresi, nevarēs izdzēst tabulu adrese,
jo uz to atsaucās cilvēka tabulā lauks id_adrese.
Vienīgais veids kā šo problēmu risina ir,
ka visas tabulas kas referējas uz šo dzēšamo tabulu,
jānoņem sasaiste (INDEX). To parasti dara ar ALTER TABLE,
jo tā ir datu bāzes strukturāla izmaiņa.
ALTER TABLE cilveks DROP COLUMN id_adrese; DROP TABLE IF EXISTS adrese;
DROP TABLE citas iespējas un parametrus sk. MySQL dokumentācijā:
DROP TABLE syntax.
Lapa mainīta 2004-11-15 22:35:00