INFORMACINĖS SISTEMOS

Download Report

Transcript INFORMACINĖS SISTEMOS

MySQL
Duomenų bazės kūrimas
Telekomunikacijų informacinės
technologijos
(2 dalis)
1
Duomenų bazės
Duomenų bazė (DB) – tai visuma tam tikru būdu
organizuotos informacijos, kuriai tvarkyti ir išrinkti
naudojamos specialios priemonės – duomenų bazės
valdymo sistema (DBVS).
Duomenų bazėje:
• duomenys apjungiami į lenteles,
• kiekvieną lentelę sudaro tam tikras eilučių ir stulpelių
skaičius,
• lentelės eilutė vadinama DB įrašu,
• kiekvieną įrašą sudaro tam tikras informacijos vienetų
skaičius; kiekviename lentelės stulpelyje būna vienas
toks vienetas.
2004-2011
 S.Maciulevičius
2
Duomenų bazės
Duomenų bazė vadinama reliacine (relation sąryšis), jei vienos lentelės įrašams tam tikru
būdu atitinka įrašas ar įrašai kitoje lentelėje.
Reliacinės DB jėga slypi tame, kad tokios DB
įgalina pagal užklausą iš susietų lentelių
išrinkti duomenis ir juos pateikti reikiama
forma.
2004-2011
 S.Maciulevičius
3
MySQL
DBVS kūrime pagrindinį vaidmenį vaidina trys firmos:
• Oracle, kurios DBVS skirtos labai didelėms DB
(panaudojant Web’ą), kurti; jos pradinio lygio Standard
Edition variantas 2003 m. gale kainavo 5995 USD;
• IBM, kurios DBVS DB2 skirta ir atskiriems
kompiuteriams, ir serveriams; 2003 m. gale DB2
Express kainavo apie 4000 USD vienam procesoriui;
• Microsoft, kurios DBVS Microsoft SQL Server 2003 m.
gale kainavo apie 5000 USD.
IBM ir Oracle yra įgijusios aukštą reputaciją stambiose
kompanijose, o Microsoft - nedidelėse firmose ar
didelių kompanijų skyriuose.
2004-2011
 S.Maciulevičius
4
MySQL
MySQL patraukli tuo, kad ji jos Unix versija yra
nemokama. Ją galima gauti adresu
http://www.mysql.com/. MySQL dirba ne tik
Unix, bet ir Windows platformose.
2004-2011
 S.Maciulevičius
5
MySQL
MySQL kildinama iš DBVS UNIREG, sukurtos
švedų kompanijos TcX užsakymu (1979 m.) ir
mSQL, kuri neatitiko aukštų kompanijos TcX
reikalavimų. Todėl 1995 metais buvo sukurta
MySQL.
1995 metais pasirodžiusi MySQL versija 3.11.1
buvo skirta Linux ir Solaris operacinėms
sistemoms, o šiandien MySQL dirba daugelyje
platformų ir platinama ne tik dvejetainių kodų
pavidalu, bet ir kartu su išeities tekstais.
2004-2011
 S.Maciulevičius
6
MySQL privalumai
• Sparta. Laikoma, kad šiuo atžvilgiu MySQL yra viena iš
sparčiausiai dirbančių DBVS, kurias galima sutikti rinkoje.
http://www.mysql.com/information/benchmarks.html puslapyje
galima rasti spartos testų rezultatus.
• Naudojimo paprastumas. Tai naši ir paprastai tvarkoma DBVS,
kurią (lyginant su kitomis DBVS) žymiai paprasčiau įdiegti ir
administruoti.
• Kaina. DBVS MySQL asmeniniams ir nekomerciniams
poreikiams platinama nemokamai.
• Užklausų kalbos palaikymas. MySQL „supranta“ užklausų kalbą
SQL (Structured Query Language), kuri naudojama praktiškai
visose šiuolaikinėse DBVS.
• Galimybės. MySQL serveris leidžia prisijungti praktiškai
neribotam vartotojų skaičiui.
2004-2011
 S.Maciulevičius
7
MySQL privalumai
• Kreipimuisi į DBVS interaktyviu režimu galima naudoti
įvairias sąsajas – tiek komandų eilutę naudojančias
kliento programas, tiek Web naršykles arba kliento
programas, dirbančias X Window sistemoje. Be to,
MySQL galima naudoti ir įvairių programavimo kalbų
(C, Perl, Java, PHP) programines sąsajas
• Pernešamumas. MySQL puikiai dirba valdant ne tik
įvairioms Unix versijoms, bet ir Windows ar OS/2. Ją
galima naudoti ir asmeniniuose kompiuteriuose, ir
galinguose serveriuose
2004-2011
 S.Maciulevičius
8
MySQL privalumai
• Sąveika ir sauga. DBVS MySQL skirta
darbui tinkle, į ją galima kreiptis per
Internetą. Ji aprūpinta išvystyta apsugos
nuo nesankcionuotos kreipties sistema
• Atviras platinimas. MySQL distributyvai
prieinami naudojant Web naršyklę
2004-2011
 S.Maciulevičius
9
MySQL privalumai
Dar keletas vartotojui svarbių MySQL savybių:
• Ryšių optimizavimas, vienu metu sutvarkant didelį
duomenų kiekį.
• Fiksuoto ir kintamo ilgio įrašai.
• Lanksti privilegijų ir slaptažodžių sistema.
• Iki 16 raktų lentelėje. Kiekvienas raktas gali turėti iki 15
laukų.
• Raktinių ir specialių laukų palaikymas operatoriuje
CREATE.
• Įvairaus ilgio skaičių (nuo 1 iki 4 baitų - ints, float, double,
fixed) ir kintamo ilgio eilučių palaikymas.
• …
2004-2011
 S.Maciulevičius
10
MySQL privalumai
• …
• Programavimo kalbų C ir Perl sąsajos [interfeisai]
• Sparti darbo su atmintimi sistema
• Lentelės patikrinimo ir „remonto“galimybė
• Apdorojant eilutes nekreipiama dėmesio į simbolių
registrą
• Visi laukai turi reikšmes pagal nutylėjimą
• INSERT galima naudoti bet kokiam laukų skaičiui
• Lengva tvarkyti lenteles, įskaitant laukų ir raktų pridėjimą
bei naikinimą
2004-2011
 S.Maciulevičius
11
Ko reikia MySQL
Norint naudoti MySQL, reikia turėti tokius
programinius produktus:
• SQL serverį. Ši programa realizuoja prieigą prie
DB.
• Kliento programas kreipimuisi į serverį. Šios
programos skirtos interaktyviam darbui su DB bei
darbui su Web mazgu (serverio valdymui, kreipties
teisėms nustatyti ir pan.).
• Kliento programas, skirtas savoms programoms
kurti. Šios programos gali būti rašomos naudojant
C (nes pati biblioteka parašyta naudojant C), taip
pat ir kitas programavimo kalbas.
2004-2011
 S.Maciulevičius
12
Duomenų bazės kūrimas
[MySQL] duomenų bazė kuriama tokia tvarka:
1. Sukuriama (inicializuojama) duomenų bazė.
2. Sukuriamos duomenų bazės lentelės.
3. Lentelės užpildomos reikiama informacija,
naudojant įterpimo, išrinkimo (iš kitos duomenų
bazės), modifikavimo ir pašalinimo operacijas.
2004-2011
 S.Maciulevičius
13
Pavyzdys ir komentarai
Kiekvieną duomenų bazę sudaro viena (retai) ar kelios
lentelės. Lentelėje mes išskiriame eilutes ir stulpelius,
pavyzdžiui:
+------------+-------+---------+--------+------------------+
| kliento_id | vardas| pavard | tel
| adresas
|
+------------+-------+---------+--------+------------------+
|
1 | Jonas | Kuzma
| 234567 | Daukanto 1 - 1
|
|
2 | Kostas| Kuzma
| 373728 | Daukanto 12 - 10 |
|
3 | Ignas | Klimas | 449373 | Kanto 2 - 10
|
|
4 | Santa | Klausas | 799999 | Siaures polius 1 |
+------------+-------+---------+--------+------------------+
Viena lentelės eilutė - tai įrašas. Įrašą sudaro keli
langeliai (laukai). Lauko turinys - atributas.
2004-2011
 S.Maciulevičius
14
Pavyzdys ir komentarai
MySQL priklauso vadinamųjų reliacinių DB kategorijai.
Reliacinę DB sudaro kelios lentelės, kuriose esanti
informacija yra tam tikru būdu susijusi (relation - ryšys,
sąryšis, tarpusavio priklausomybė).
SQL leidžia kombinuoti visose lentelėse esančius duomenis,
sudarant ir analizuojant duomenų sąryšius.
Turėtąją lentelę
+------------+-------+---------+--------+------------------+
| kliento_id | vardas| pavard | tel
| adresas
|
+------------+-------+---------+--------+------------------+
|
1 | Jonas | Kuzma
| 234567 | Daukanto 1 - 1
|
|
2 | Kostas| Kuzma
| 373728 | Daukanto 12 - 10 |
|
3 | Ignas | Klimas | 449373 | Kanto 2 - 10
|
|
4 | Santa | Klausas | 799999 | Siaures polius 1 |
+------------+-------+---------+--------+------------------+
2004-2011
 S.Maciulevičius
15
Pavyzdys ir komentarai
papildykime tokia:
+----------+-------------------+------------------+
| video_id | filmas
| autorius
|
+----------+-------------------+------------------+
|
1 | Star Wars
| George Lucas
|
|
2 | ET
| Ignas Spielberg |
|
3 | Charlie's Angels | McG
|
|
4 | Any Given Sunday | Oliver Stone
|
|
5 | Hollow Man
| Paul Verhoeven
|
|
6 | Woman On Top
| Fina Torres
|
+----------+-------------------+------------------+
2004-2011
 S.Maciulevičius
16
Pavyzdys ir komentarai
ir dar tokia:
+------------+----------+
| kliento_id | video_id |
+------------+----------+
|
2 |
6 |
|
4 |
2 |
|
1 |
1 |
|
1 |
2 |
|
1 |
3 |
+------------+----------+
Kaip matome, pastaroji lentelė suriša dvi pirmąsias.
Joje nurodyta, kuris asmuo kurią vaizdajuostę turi
paėmęs.
2004-2011
 S.Maciulevičius
17
Lentelių sąryšis
+------------+-------+---------+--------+------------------+
| kliento_id | vardas| pavard | tel
| adresas
|
+------------+-------+---------+--------+------------------+
|
1 | Jonas | Kuzma
| 234567 | Daukanto 1 - 1
|
|
2 | Kostas| Kuzma
| 373728 | Daukanto 12 - 10 |
|
3 | Ignas | Klimas | 449373 | Kanto 2 - 10
|
|
4 | Santa | Klausas | 799999 | Siaures polius 1 |
+------------+-------+---------+--------+------------------+
+------------+----------+
| kliento_id | video_id |
+------------+----------+
|
2 |
6 |
|
4 |
2 |
|
1 |
1 |
|
1 |
2 |
|
1 |
3 |
+------------+----------+
2004-2011
+----------+-------------------+------------------+
| video_id | filmas
| autorius
|
+----------+-------------------+------------------+
|
1 | Star Wars
| George Lucas
|
|
2 | ET
| Ignas Spielberg |
|
3 | Charlie's Angels | McG
|
|
4 | Any Given Sunday | Oliver Stone
|
|
5 | Hollow Man
| Paul Verhoeven
|
|
6 | Woman On Top
| Fina Torres
|
+----------+-------------------+------------------+
 S.Maciulevičius
18
MySQL iškvietimas
MySQL iškviečiama taip: $ mysql –u vartot -p
Tuomet reikia įvesti vartotojo slaptažodį. Prisijungus prie
programos, pasirodo maždaug toks pranešimas:
Welcome to the MySQL monitor. Commands end
with ; or \g.
Your MySQL connection id is 80 to server
version: 3.23.24-beta-debug
Type 'help;' or '\h' for help.
mysql>
Dabar sistema laukia komandos.
2004-2011
 S.Maciulevičius
19
Duomenų bazės sukūrimas
Kadangi visos MySQL lentelės laikomos duomenų bazėje,
reikia pradėti nuo jos sukūrimo, pavyzdžiui:
mysql> CREATE DATABASE katalogas;
Query OK, 1 row affected (0.05 sec)
Duomenų bazė, kurią tvarkysime, nurodoma komanda
USE:
mysql> USE katalogas;
Database changed
2004-2011
 S.Maciulevičius
20
Lentelių sukūrimas
Duomenų bazės lentelių sąrašą galoma pamatyti
nurodžius komandą SHOW TABLES:
mysql> SHOW TABLES;
Empty set (0.00 sec)
Duomenų bazės lentelės sukuriamos komanda CREATE
TABLE.
CREATE TABLE komandos sintaksė:
CREATE TABLE <table_name>
(<field_name_1> <field_type_1> <modifiers>,
<field_name_2> <field_type_2> <modifiers>,
... ,
<field_name_n> <field_type_n> <modifiers>)
2004-2011
 S.Maciulevičius
21
CREATE TABLE komanda
Stulpelio aprašas:
<field_name_1> <field_type_1>
<modifiers>
Čia:
<field_name_1> - stulpelio pavadinimas
<field_type_1> - stulpelio tipas
<modifiers> - papildoma informacija apie
stulpelį – parametrai
arba PRIMARY KEY index_col_name,...
- stulpelis indeksuojamas duomenų paieškai
paspartinti
2004-2011
 S.Maciulevičius
22
Stulpelio tipas
Nurodoma:
•
•
•
•
•
kokio tipo reikšmės jame saugomos;
koks jų dydis (ilgis);
kaip to tipo reikšmės palyginamos ir rikiuojamos;
ar jame gali būti saugomos “tuščios” reikšmės;
ar to tipo reikšmės gali būti indeksuojamos.
Duomenų tipai:
• skaičiai,
• simbolių eilutės,
• data ir laikas.
2004-2011
 S.Maciulevičius
23
Pagrindiniai žymėjimai
Laužtiniai skliaustai [ elem ] žymi nebūtiną
informaciją (elemento elem gali ir nebūti)
length – maksimalus galimas simbolių skaičius
vaizduojant informaciją
decimals – dešimtainių skaitmenų skaičius po
kablelio
2004-2011
 S.Maciulevičius
24
Pagrindiniai stulpelio tipai
INT[(length)] [UNSIGNED] [ZEROFILL]
arba INTEGER[(length)][UNSIGNED]
[ZEROFILL]
arba FLOAT[(length,decimals)][UNSIGNED]
[ZEROFILL]
arba DECIMAL(length,decimals) [UNSIGNED]
[ZEROFILL]
arba CHAR(length) [BINARY]
arba VARCHAR(length) [BINARY]
arba ...
2004-2011
 S.Maciulevičius
25
Pagrindiniai skaitiniai tipai
Pagrindiniai skaitinių duomenų tipai:
• INT (M), INTEGER(M) (sinonimai) – sveikieji skaičiai nuo
-231 iki 231-1 (be ženklo - nuo 0 iki 232-1)
• FLOAT(M,D) – slankaus kablelio skaičiai: nuo -1038 iki 1038
• DECIMAL(M,D) – dešimtainiai skaičiai; priklauso nuo M ir D
• CHAR(M) – M simbolių eilutė (fiksuoto ilgio: M<256;
trumpesnės eilutės gale pridedami “tarpai”)
• VARCHAR(M) – M simbolių eilutė (kintamo ilgio: 0-M;
M<256)
2004-2011
 S.Maciulevičius
26
Simbolių eilutės
Simbolių eilutės ilgis M<256; užrašant eilutė iš abiejų
galų “įrėminama” paprastomis arba dvigubomis
kabutėmis: “Tai yra eilutė”.
Jei prisireikia naudoti specialiuosius simbolius, jų
užrašymui tenka naudoti simbolių sekas:
• paprastai kabutei - \’
• dvigubai kabutei - \”
• naujai eilutei - \n
2004-2011
• tabuliacijai - \t
• pasviram brūkšniui - \\
 S.Maciulevičius
27
Papildomi stulpelio tipai
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
arba SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
arba BIGINT[(length)] [UNSIGNED] [ZEROFILL]
arba DOUBLE[(length, decimals)] [UNSIGNED]
[ZEROFILL]
arba DATE
arba TEXT
arba SET(value1,value2,value3,...)
arba ...
2004-2011
 S.Maciulevičius
28
Papildomi stulpelio tipai
• TINYINT – nuo -128 iki 127 (be ženklo - nuo 0 iki 256)
• SMALLINT – nuo -32768 iki 32767 (be ženklo - nuo 0 iki
65535)
• BIGINT – nuo -263 iki 263-1 (be ženklo - nuo 0 iki 264-1)
• DOUBLE(M,D) – dvigubo ilgio slankaus kablelio skaičiai;
nuo -10308 iki 10308
• DATA – data, vaizduojama formatu YYYY-MM-DD
• TEXT – eilutė, kurią sudaro atitinkamo ilgio tekstas
(TINYTEXT – iki 28 baitų, …, LONGTEXT – iki 232 baitų)
2004-2011
 S.Maciulevičius
29
Duomenų apimtis
• TINYINT
– 1 baitas
• SMALLINT
– 2 baitai
• INT
– 4 baitai
• BIGINT
• FLOAT(M,D)
• DOUBLE(M,D)
– 8 baitai
– 4 baitai
– 8 baitai
• DECIMAL(M,D) – M baitų (MySQL < 3.23) arba M+2
baitai (MySQL >= 3.23); pvz., DECIMAL(4,2)
diapazonas MySQL < 3.23 yra nuo -9,9 iki +9,9, o MySQL
>= 3.23 - nuo -999,9 iki +999,9
2004-2011
 S.Maciulevičius
30
Stulpelio tipai
Kai kurie kiti duomenų tipai:
• ENUM(“value1”, “value2”,…) – eilutės tipo
duomenų rinkinys; galima tik viena reikšmė iš šio
sąrašo;
• SET(“value1”, “value2”,…) – eilutės tipo
duomenų rinkinys; galimas bet koks reikšmių
rinkinys iš šio sąrašo;
• DATA – nuo “1000-01-01” iki “9999-12-31”;
• YEAR – nuo 1901 iki 2155.
2004-2011
 S.Maciulevičius
31
Stulpelio tipo parinkimas
Dažniausiai sutinkamas duomenų tipas – simbolių
eilutės. Tai gana universalus tipas, nes į tokio tipo
stulpelius galima įrašyti ne tik tekstą, bet ir skaičius,
datas, telefono numerius.
Gal galima ir nenaudoti skaitinių ar datų tipo stulpelių?
Skaitiniai duomenys efektyviau laikomi kompiuterio
atmintyje, kitaip interpretuojami rikiuojant.
Pavyzdžiui, skaičius 3<12, tačiau eilutė “3”>”12”.
2004-2011
 S.Maciulevičius
32
Stulpelio tipo parinkimas
Parenkant stulpelio duomenų tipą, reikia
atsižvelgti į tokius dalykus:
1.
2.
3.
Kokio tipo duomenys (skaitiniai, tekstiniai, datos, ...)
reikalingi konkrečiu atveju?
Koks duomenų reikšmių diapazonas (skaičiams, eilučių
ilgiams, ...)? Ar skaitiniai duomenys bus tik teigiami
(parametras UNSIGNED)? Jei simbolių eilutės – ar reikšmių
aibė fiksuota (tipas SET)?
Apdorojimo spartą ir efektyvumą: skaitiniai duomenys
apdorojami sparčiau nei simbolių eilutės, trumpesnės
simbolių eilutės palyginamos sparčiau nei ilgesnės,
lentelės su fiksuoto ilgio eilutėmis apdorojamos sparčiau
nei lentelės su kintamo ilgio eilutėmis .
2004-2011
 S.Maciulevičius
33
Stulpelio tipo parinkimas
Dar pora dalykų:
4.
5.
6.
Kaip bus palyginamos reikšmės? Ar simbolių eilutėse
reikės skirti mažąsias raides nuo didžiųjų?
Ar duomenys bus rikiuojami (rikiavimas atliekamas
naudojant palyginimą)?
Ar duomenys bus indeksuojami? Reikia atminti, kad BLOB
ir TEXT tipo duomenys nėra indeksuojami. Ankstesnėse
versijose indeksuojami stulpeliai turi būti paskelbti NOT
NULL.
2004-2011
 S.Maciulevičius
34
Stulpelio parametrai
Priklauso nuo duomenų tipo:
• sveikieji skaičiai gali būti tik teigiami (UNSIGNED) arba su
ženklu;
• ZEROFILL nurodo, kad skaičiai iš kairės papildomi nuliais;
• AUTO_INCREMENT nurodo, kad stulpelis užpildomas
nuosekliai didėjančiais skaičiais; toks stulpelis būtinai
sveikųjų skaičių tipo, vienintelis lentelėje ir turi būti
paskelbtas kaip pirminis raktas (PRMARY KEY);
• NULL nurodo, kad stulpelis užpildomas nuliais (kai
neįvestos kitos reikšmės);
• NOT NULL nurodo, kad stulpelis privalo būti užpildytas
(įvestos kokios nors reikšmės).
2004-2011
 S.Maciulevičius
35
CREATE TABLE komanda
Pavyzdys:
create table uzsakymai(
-> uzs_nr int(4) NOT
auto_increment,
-> tel_id int(5) NOT
-> kiekis int(3) NOT
-> data varchar (10)
-> uzsakovas varchar
NULL
NULL,
NULL,
NOT NULL,
(20) NOT NULL);
Atkreipkime dėmesį į įvedamos komandos “sukapojimą” į 6
eilutes: įvedus create table uzsakymai( ir paspaudus
<Enter>, naujoje eilutėje pasirodo kvietimas -> tęsti
komandą.
2004-2011
 S.Maciulevičius
36
CREATE TABLE komanda
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]
tbl_name
• Sukuriant lentelę, galima naudoti TEMPORARY raktą.
Tokia lentelė bus automatiškai pašalinta, nutraukus
ryšį su serveriu. Tai reiškia, kad skirtingi
prisijungimai gali naudoti tą patį vardą ir nebus
konfliktų.
• MySQL 3.22 ar paskesnėse versijose galima
naudoti raktus IF NOT EXISTS, tada nebus
fiksuojama klaida, jei tokiu vardu lentelė jau
egzistuoja.
2004-2011
 S.Maciulevičius
37
Klaidos ir jų taisymas
Tarkime, padarėme klaidą – įvesdami komandą,
praleidome “L”:
create table uzsakymai(
-> uzs_nr int(4) NOT
auto_increment,
-> tel_id int(5) NOT
-> kiekis int(3) NOT
-> data varchar (10)
-> uzsakovas varchar
2004-2011
 S.Maciulevičius
NULL
NUL,
NULL,
NOT Null,
(20) NOT NULL);
38
Klaidos ir jų taisymas
Ekrane pasirodė toks pranešimas:
ERROR 1064: You have an error in your SQL
syntax. Check the manual that corresponds to
your MySQL server version for the right syntax
to use near 'NUL,
kiekis int(3) NOT NULL,
data varchar (10) NOT Null,
uzsako
2004-2011
 S.Maciulevičius
39
Klaidos ir jų taisymas
Tai reiškia, kad įvedant padaryta klaida.
Klaidą apibūdinantis tekstas sako, kad reikia
patikrinti sintaksę maždaug toje vietoje, kur
yra tekstas „NUL,
-> kiekis int(3) NOT NULL, ...“.
Atidžiai pažiūrėję pastebime, kad turi būti NULL,
o ne NUL.
2004-2011
 S.Maciulevičius
40
Klaidos ir jų taisymas
Pataisome: spaudžiame klavišą <>, iki pasirodys pirmoji eilutė
create table uzsakymai(
po to - <Enter> (kadangi jos taisyti nereikia),
po to vėl spaudžiame klavišą <>, iki pasirodys antroji eilutė
uzs_nr int(4) NOT NULL auto_increment,
po to - <Enter> (kadangi ir jos taisyti nereikia), po to vėl
spaudžiame klavišą <>, iki pasirodys trečioji eilutė
tel_id int(5) NOT NUL,
dabar ją pataisome, žymiklį stumdydami rodyklių klavišais  ir
:
tel_id int(5) NOT NULL,
2004-2011
 S.Maciulevičius
41
Klaidos ir jų taisymas
Taip tęsiame iki pabaigos, iškviedami likusias eilutes ir
patvirtindami klavišu <Enter>:
mysql> create table uzsakymai(
-> uzs_nr int(4) NOT NULL
auto_increment,
-> tel_id int(5) NOT NULL,
-> kiekis int(3) NOT NULL,
-> data varchar (10) NOT Null,
-> uzsakovas varchar (20) NOT NULL);
2004-2011
 S.Maciulevičius
42
Klaidos ir jų taisymas
Ekrane pasirodė kitoks pranešimas:
ERROR 1075: Incorrect table definition; There can only
be one auto column and it must be defined as a key
Jis sako, kad automatiškai pildomas didėjimo tvarka
stulpelis turi būti paskelbtas kaip pirminis raktas.
Pataisome:
2004-2011
 S.Maciulevičius
43
Klaidos ir jų taisymas
mysql> create table uzsakymai(
-> uzs_nr int(4) NOT NULL
auto_increment,
-> tel_id int(5) NOT NULL,
-> kiekis int(3) NOT NULL,
-> data varchar (10) NOT Null,
-> uzsakovas varchar (20) NOT NULL,
-> primary key (uzs_nr) );
Ekrane pasirodė toks pranešimas:
Query OK, 0 rows affected (0.01 sec)
Jis rodo, kad lentelė sukurta teisingai.
2004-2011
 S.Maciulevičius
44
Klaidos ir jų taisymas
Pasitikriname:
mysql> show tables;
+-----------–-----+
| Tables_in_stama |
+-----------------+
| uzsakymai
|
+-----------------+
1 row in set (0.01 sec)
2004-2011
 S.Maciulevičius
45
Lentelės modifikavimas
Dažnai prisireikia modifikuoti lentelę:
•
•
•
•
•
•
keisti lentelės pavadinimą;
pridėti naują stulpelį;
keisti stulpelio pavadinimą;
išmesti stulpelį;
keisti anksčiau sukurto stulpelio tipą;
pridėti indeksą.
Tam tikslui skirta komanda ALTER TABLE
2004-2011
 S.Maciulevičius
46
ALTER komanda
ALTER TABLE tbl_name alter_spec [,
alter_spec ...]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER
col_name ]
arba ADD INDEX [index_name]
(index_col_name,...)
arba ADD PRIMARY KEY (index_col_name,...)
arba CHANGE [COLUMN] old_col_name
create_definition
arba MODIFY [COLUMN] create_definition
arba DROP [COLUMN] col_name
arba DROP PRIMARY KEY
arba DROP INDEX index_name
arba RENAME [AS] new_tbl_name
2004-2011
 S.Maciulevičius
47
ALTER komanda
Jei prisireikia modifikuoti lentelę, komandą
ALTER TABLE naudokite taip:
• jei keičiate lentelės pavadinimą:
ALTER TABLE <table_name> RENAME AS
<new_table_name>
• jei pridedate naują stulpelį :
ALTER TABLE <table_name> ADD
<new_field_name> <new_field_type>
2004-2011
 S.Maciulevičius
48
ALTER komanda
Jei prisireikia modifikuoti stulpelį:
• jei modifikuojate anksčiau sukurtą stulpelį:
ALTER TABLE <table_name> MODIFY
<old_field_name> <new_field_type>
<modifiers>
• jei modifikuojate kartu pervardydami anksčiau
sukurtą stulpelį:
ALTER TABLE <table_name> CHANGE
<old_field_name> <new_field_name>
<new_field_type> <modifiers>
2004-2011
 S.Maciulevičius
49
ALTER komandos pavyzdžiai
Turime lentelę lent1, sukurtą tokiu būdu:
mysql> CREATE TABLE lent1 (a INTEGER,b
CHAR(10));
Pakeisime jos pavadinimą iš lent1 į lent2:
mysql> ALTER TABLE lent1 RENAME lent2;
Pakeisime stulpelio tipą iš INTEGER į TINYINT NOT
NULL (nekeisdami pavadinimo), o b tipą pakeisime iš
CHAR(10) į CHAR(20), kartu pakeisime jo pavadinimą
iš b į c:
mysql> ALTER TABLE lent2 MODIFY a TINYINT
NOT NULL, CHANGE b c CHAR(20);
2004-2011
 S.Maciulevičius
50
ALTER komandos pavyzdžiai
Pridėsime naują TIMESTAMP stulpelį d:
mysql> ALTER TABLE lent2 ADD d
TIMESTAMP;
Pridėsime stulpelio d indeksavimą ir stulpelį
a padarysime pirminiu raktiniu:
mysql> ALTER TABLE lent2 ADD
INDEX (d), ADD PRIMARY KEY (a);
2004-2011
 S.Maciulevičius
51
ALTER komandos pavyzdžiai
Panaikinsime stulpelį c:
mysql> ALTER TABLE lent2 DROP
COLUMN c;
Pridėsime naują AUTO_INCREMENT sveikųjų
skaičių stulpelį c:
mysql> ALTER TABLE lent2 ADD c INT
UNSIGNED NOT NULL
AUTO_INCREMENT, ADD INDEX (c);
Indeksavome c, nes AUTO_INCREMENT
stulpeliai turi būti indeksuoti, be to,
indeksuoti stulpeliai negali buti NULL.
2004-2011
 S.Maciulevičius
52
Informacijos apie DB gavimas
Sukūrę DB ir jos lenteles, katrais jas užpildome
ne iš karto. Jei pamiršome, kokie lentelių
pavadinimai, kokie stulpelių pavadinimai ir jų
tipai, galima informaciją apie visa tai
pasitikslinti, naudojant įvairius komandos
SHOW variantus.
Numatyta galimybė gauti tokią informaciją:
• mysql> SHOW DATABASES; Pateikia
serveryje laikomų DB sąrašą.
• mysql> SHOW TABLES; Pateikia
naudojamoje DB esančių lentelių sąrašą.
2004-2011
 S.Maciulevičius
53
Informacijos apie lentelę gavimas
• mysql> SHOW COLUMNS FROM
tbl_name; Pateikia informaciją apie
nurodytos lentelės stulpelius. Vietoje šios
galima naudoti komandą DESCRIBE
tbl_name arba komandą EXPLAIN
tbl_name
• mysql> SHOW INDEX FROM
tbl_name; Pateikia informaciją apie
nurodytos lentelės indeksus.
2004-2011
 S.Maciulevičius
54
Informacijos apie lentelę gavimas
Apie aukščiau pavyzdyje pateiktą lentelę gautume
tokią informaciją:
mysql> explain uzsakymai;
+-----------+-------------+------+-----+---------+----------------+
| Field
| Type
| Null | Key | Default | Extra
|
+-----------+-------------+------+-----+---------+----------------+
| uzs_nr
| int(4)
|
| PRI | NULL
| auto_increment |
| tel_id
| int(5)
|
|
| 0
|
|
| kiekis
| int(3)
|
|
| 0
|
|
| data
| varchar(10) |
|
|
|
|
| uzsakovas | varchar(20) |
|
|
|
|
+-----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
2004-2011
 S.Maciulevičius
55
Lentelės užpildymas
Sukūrus lentelę, reikia ją užpildyti. Tai galima
padaryti keliais būdais:
• Pridedant naujus įrašus, kai nurodomas
kiekvieno stulpelio (ar tik nurodytų stulpelių)
turinys;
• Pridedant naujus įrašus, kurie paimami iš kitos
lentelės;
• Importuojant įrašus iš kito failo.
Tam tikslui skirta komanda INSERT
2004-2011
 S.Maciulevičius
56
INSERT komanda
INSERT komandos sintaksė pirmuoju atveju:
INSERT INTO <table_name>
(field_name_1, field_name2,
field_name_n) VALUES (value_1,
value_2, value_n)
Čia išvardyti stulpelių pavadinimus reikia tik tuo atveju,
jei nurodomos ne visų jų reikšmės.
Pavyzdys:
mysql> INSERT INTO nariai (kliento_id,
vardas, pavard, tel, adresas) VALUES
(NULL, ‘Jonas', 'Kuzma', '1234567',
'Daukanto 1 - 1');
Query OK, 1 row affected (0.06 sec)
2004-2011
 S.Maciulevičius
57
INSERT komanda
INSERT komandos sintaksė antruoju atveju:
INSERT INTO <table_name>
(field_name_1, field_name2,
field_name_n) SELECT ...
Čia SELECT nurodo iš kitos lentelės
išrenkamus duomenis.
Apie įrašų importavimą iš kito failo (trečiąjį atvejį)
kalbėsime vėliau.
2004-2011
 S.Maciulevičius
58
SELECT komanda
Jei norime pažiūrėti, kaip atrodo sukurtoji lentelė, reikia
panaudoti SELECT komandą, kuri išrinktų visus
lentelės "nariai" įrašus:
mysql> SELECT * FROM nariai;
+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard | tel
| adresas
|
+------------+-------+---------+---------+------------------+
|
1 | Jonas | Kuzma
| 1234567 | Kampo 132-15
|
|
2 | Kostas| Kuzma
| 8373728 | Daukanto 12 - 10 |
|
3 | Ignas | Klimas | 7449373 | Kanto 2 - 10
|
|
4 | Santa | Klausas | 9999999 | Siaures polius 1 |
+------------+-------+---------+---------+------------------+
4 rows in set (0.00 sec)
2004-2011
 S.Maciulevičius
59
Lentelės turinio modifikavimas
Įvedant informaciją į lentelę, dažnai įsivelia
viena kita klaida, todėl prisireikia jas
ištaisyti.
Tai galima padaryti dviem būdais:
• išmesti eilutes, kuriose yra klaidos, ir jas įvesti
iš naujo;
• pakeisti tik to stulpelio turinį, kuriame yra
neteisingi duomenys.
Taisymo būdo pasirinkimas, aišku,
priklausys nuo klaidos ar klaidų kiekio ir
pobūdžio
2004-2011
 S.Maciulevičius
60
Eilučių išmetimas
Eilutės išmetamos naudojant komandą DELETE.
Šios komandos sintaksė:
DELETE FROM tbl_name
[WHERE where_definition]
[LIMIT rows]
DELETE iš lentelės tbl_name pašalina eilutes, kurios
tenkina nurodytą salygą where_definition, ir
nurodo pašalintų irašų numerius.
2004-2011
 S.Maciulevičius
61
Eilučių išmetimas
Pateikus DELETE komandą be WHERE dalies, bus
pašalintos visos eilutes.
MySQL lentele tampa tuščia, ir tai žymiai greičiau, nei
išmestume eilutes po vieną. Tokiu atveju DELETE
parodo, kad pašalinta 0 eilučių.
Kol egzistuoja lentelę aprašantis failas `tbl_name.frm',
lentelė gali būti atkurta, nors duomenų ar indekso failai ir
sugadinti.
DELETE opcija LIMIT rows serveriui nurodo
maksimalu skaičių eiluciu, kurias pašalinus gražinamas
valdymas klientui. Tai daroma norint isitikinti, kad
DELETE komanda neužima per daug laiko. DELETE
komanda galima tuomet vel pakartoti.
2004-2011
 S.Maciulevičius
62
Eilučių išmetimas
Pavyzdys:
mysql> DELETE FROM nariai;
Query OK, 0 rows affected (0.06 sec)
Bus pašalinti visi lentelės "nariai" įrašai.
Jei reikia pašalinti tik tuos lentelės "nariai" įrašus,
kuriuose kliento_id = 16:
mysql> DELETE FROM nariai WHERE
kliento_id = 16;
Query OK, 1 row affected (0.06 sec)
2004-2011
 S.Maciulevičius
63
Eilutės turinio modifikavimas
Eilutės turiniui modifikuoti skirta
komanda UPDATE.
Jos sintaksė:
UPDATE [LOW_PRIORITY] tbl_name
SET
col_name1=expr1,col_name2=expr2
,...
[WHERE where_definition] [LIMIT
#]
2004-2011
 S.Maciulevičius
64
Eilutės turinio modifikavimas
UPDATE atnaujina anksčiau sukurtos
lentelės stulpelių reikšmes.
SET dalis nurodo, kurie stulpeliai turi būti
pakeisti ir kokias reikšmes jie įgys.
WHERE dalis (jei ji yra) nurodo, kurios
eilutės turi buti keičiamos. Jei WHERE
dalies nera - atnaujinamos visos eilutės.
2004-2011
 S.Maciulevičius
65
Eilutės turinio modifikavimas
Pavyzdys:
Jei reikia pakeisti Jono Kuzmos adresą nauju:
mysql> UPDATE nariai SET adresas =
'Kampo 132-15' WHERE kliento_id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1
Warnings: 0
2004-2011
 S.Maciulevičius
66
Eilutės turinio modifikavimas
UPDATE komanda gali modifikuoti kelių įrašo
stulpelių reikšmes:
mysql>
UPDATE
SET adresas = 'Kampo
12-1 , pavard= 'Kazokas’
WHERE kliento_id = 2;
Query OK, 1 row affected (0.05
sec)
Rows matched: 1 Changed: 1
Warnings: 0
2004-2011
 S.Maciulevičius
67
Eilutės turinio modifikavimas
Tuomet lentelė atrodys taip:
mysql> SELECT * FROM nariai;
+------------+-------+-------------+---------+------------------+
| kliento_id | vardas| pavard
| tel
| adresas
|
+------------+-------+-------------+---------+------------------+
|
1 | Jonas | Kazokas
| 1234567 | Kampo 12-1
|
|
2 | Kostas| Kuzma
| 8373728 | Daukanto 12 - 10 |
|
3 | Ignas | Klimas
| 7449373 | Kanto 2 - 10
|
|
4 | Santa | Klausas
| 9999999 | Siaures polius 1 |
+------------+-------+-------------+---------+------------------+
4 rows in set (0.00 sec)
2004-2011
 S.Maciulevičius
68