PHPPamokos.lt


3. Kuriame DB lenteles - jų laukai ir tipai

Užtenka teorijos - pradėkime kurti kažką realaus ir rašyti užklausas. Kaip jau ne kartą minėjau, duomenų bazės susideda iš lentelių - tai pirmiausia išmoksime dirbti su jų struktūra.

Iš principo, viena lentelė tai yra vienos konkrečios rūšies, vieno objekto ir paskirties duomenų rinkinys. Sakykime, lentelė "users" būtų skirta vartotojams, lentelėje "orders" būtų saugomi užsakymai ir t.t. Taigi, lentelių pavadinimus sugalvokite tokius, kad iš jų būtų vienareikšmiškai aišku, kas joje saugoma. Jei norite pavadinimą sudaryti iš dviejų ar daugiau žodžių, skaitymo patogumui vartokite pabraukimo ženklą - "order_items", "users_roles" ir t.t.

Taigi, pirmoji užklausa - kuriame lentelę. Sukurkime lentelę iš tiesiog dviejų laukų - vardo ir pavardės:

CREATE TABLE people (
  name VARCHAR(100),
  surname VARCHAR(100)
);

Štai taip atrodo užklausą lentelės sukūrimui. Ji susideda iš tokių dalių:

  • Komanda CREATE TABLE
  • Lentelės pavadinimas
  • Skliausteliuose laukų sąrašas per kablelį

Turbūt neaiškiausia dalis čia yra VARCHAR(100) - tai yra vienas iš lauko tipų, nusakantis teksto eilutę iš 100 simbolių. Tai pats laikas pasiaiškinti, kokie tie tipai būna, išvardinsiu pagrindinius ir dažniausiai naudojamus.

Lentelės laukų tipai

Skaičių tipai

  • INT(X) - sutrumpinimas nuo INTEGER, tai yra sveikas skaičius - X skaitmenų ilgio. Galimos reikšmės yra -2147483648 iki 2147483647, maksimalų X galite nurodyti 11.
  • Sveikų skaičių tipų variantai yra TINYINT (nuo -128 iki 127), SMALLINT (nuo -32768 iki 32767), MEDIUMINT (nuo -8388608 iki 8388607) ir BIGINT (nuo -9223372036854775808 iki 9223372036854775807).
  • FLOAT(X,Y) - trumpena su maksimum Y skaitmenų po kablelio ir su X ilgiu (įskaitant skaičius po kablelio). Nenurodant X ir Y, bus nustatyta 10 ir 2, t.y. galima bus įrašyti maksimum 10 skaitmenis - 8 sveikus ir 2 po kablelio. Maksimaliai galima nustatyti Y = 7
  • DOUBLE(X,Y) - tas pats kaip FLOAT, bet galima nustatyti daugiau skaičių po kablelio - net 14. Praverčia žemėlapio koordinatėms saugoti.

Pastaba: prie sveikųjų skaičių tipo gali būti nurodomas papildomas parametras UNSIGNED, kuris reiškia, kad gali būti saugomi tik teigiami skaičiai (ir 0), pvz:

CREATE TABLE people (
  age INT UNSIGNED
);

Šiame pavyzdyje tai reiškia, kad gali būti saugomos tik teigiamos reikšmės, dėl to galimos reikšmės pasislenka - vietoje -2147483648 iki 2147483647 dabar galime saugoti nuo 0 iki 4294967295.

Teksto eilučių tipai

  • CHAR(X) - fiksuoto ilgio X (nuo 1 iki 255) teksto eilutė
  • VARCHAR(X) - nefiksuoto ilgio X (nuo 1 iki 255) teksto eilutė. Turbūt neaišku, kas reiškia fiksuoto ir nefiksuoto ilgio? Reiškia, kiek atminties realiai bus išnaudojama duomenims saugoti: sakykime, CHAR(50) reikšmei saugoti skirs lygiai 50 simbolių, nes jei reali eilutė bus mažesnė, o VARCHAR(50) skirs tiek vietos, kokio realiai ilgio bus reikšmė, tokiu būdu yra sutaupoma vieta. Dėl šios priežasties VARCHAR tipas yra naudojamas daug dažniau.
  • TEXT - skirtas ilgesnių eilučių saugojimui, ilgio nurodyti nereikia, o apribojimas yra 65535 simboliai.
  • ENUM('aa', 'bb', 'cc') - jeigu norite saugoti kelias visiškai konkrečias tekstines reikšmes ir kitokių variantų negali būti.

Datos ir laiko tipai

  • DATE - data YYYY-MM-DD formatu, tarp 1000-01-01 ir 9999-12-31
  • TIME - laikas HH:MM:SS formatu
  • DATETIME - data ir laikas YYYY-MM-DD HH:MM:SS formatu, tarp 1000-01-01 00:00:00 ir 9999-12-31 23:59:59
  • TIMESTAMP - įdomus tipas: UNIX TIMESTAMP laikas, saugomas realiai kaip skaičius - kiek sekundžių praėjo nuo 1970 metų sausio 1 dienos vidurnakčio.

NULL ar NOT NULL?

Kiekvienas laukas turi savybę - ar jo reikšmė gali būti tuščia. Bet tuščia ne ta prasme kad tuščia eilutė, o taip vadinama NULL reikšmė - tai yra ne tuščia eilutė, ne skaičius 0 o būtent NULL - tuščia reikšmė. Jei tokia reikšmė leidžiama - tada įterpiant naują eilutę, galima to lauko ir nepildyti. O jeigu laukas nustatytas kaip negalintis būti NULL, tada jis yra būtinas įterpiant eilutę - kitaip mes klaidą.

Galbūt skamba painokai, bet pažiūrėkime į konkretų pavyzdį.

CREATE TABLE people (
  name VARCHAR(100) NULL,
  surname VARCHAR(100) NOT NULL
);

Tas pats pavyzdys iš viršaus, tik po lauko tipo yra dar NULL arba NOT NULL. Kitaip tariant, vardas gali būti tuščias, bet pavardę įvesti yra privaloma.

Užbėgsime šiek tiek į priekį ir pažiūrėsime, kokią įtaką tai turi reikšmių įterpimui.

Pvz 1. Šita įterpimo užklausa veiks gerai:
INSERT INTO people (name, surname) values ('Petras', 'Jonaitis');
Pvz 2. Šita įterpimo užklausa irgi veiks gerai - vietoje vardo įterps NULL, nes lentelės savybė tai leidžia:
INSERT INTO people (surname) values ('Jonaitis');
Pvz 3. Šita įterpimo užklausa išmes klaidą "'surname' cannot be NULL":
INSERT INTO people (name) values ('Petras');

Jeigu prie lauko nenurodote nei NULL nei NOT NULL, tai MySQL automatiškai priskiria NOT NULL reikšmę.

Laukas ID: PRIMARY KEY ir AUTO_INCREMENT

Ir paskutinis svarbus dalykas, kurį reikia žinoti, kuriant DB lenteles - yra pirminis raktas. Yra tokia praktika - kiekvienoje lentelėje turėti unikalų idenfitikatorių, pagal kurį galima atrasti unikalią eilutę. Dažniausiai to lauko pavadinimas yra id ir jis nesikartoja - t.y. bus tik viena eilute su id=1, tik viena eilutė su id=2 ir t.t. O dar patogiau yra tai, kad galima šitam laukui nustatyti savybę AUTO_INCREMENT, kuri leis jums nesirūpinti tuo lauku - jis bus pildomas automatiškai, pridedant +1 prie kiekvienos naujos eilutės.

Sintaktiškai tai daroma taip - prie paties lauko pridedame savybę AUTO_INCREMENT, o apačioje po visais laukais jį nurodome kaip PRIMARY KEY:

CREATE TABLE people (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(100) NULL,
  surname VARCHAR(100) NOT NULL,
  PRIMARY KEY (id)
);

Taigi, kas įvyksta su duomenimis, įterpiant juos į lentelę? Vėlgi, užbėgsime į priekį prie INSERT sakinio ir pažiūrėsime į tokius pavyzdžius:

Pvz 1. Galima id lauką pildyti rankiniu būdu:
INSERT INTO people (id, name, surname) values (1, 'Pirmas', 'Jonaitis');
INSERT INTO people (id, name, surname) values (2, 'Antras', 'Petraitis');
Pvz 2. Galima id lauką praleisti, ir jis bus užpildytas automatiškai:
INSERT INTO people (name, surname) values ('Pirmas', 'Jonaitis');
INSERT INTO people (name, surname) values ('Antras', 'Petraitis');

Antrame pavyzdyje Jonaičio eilutė automatiškai turės id=1, o Petraičio id=2.

Apibendrinimas

Štai tiek reikia žinoti apie lentelių struktūrą, laukus ir jų tipus bei savybes. To pilnai užtenka, kad galėtume kurti visos duomenų bazės struktūrą po vieną lentelę.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com