PHPPamokos.lt


4. Įterpiame ir atnaujiname duomenis - INSERT ir UPDATE užklausos

Praeitoje pamokoje išmokome kurti lenteles ir sužinojome iš ko jos susideda, kokie gali būti laukų tipai ir t.t. Pats laikas užpildyti tas lenteles realiais duomenimis - jau matėme keletą INSERT užklausų, šioje pamokoje pažvelgsime į tą komandą kiek giliau.

Sintaksiškai viskas paprasta:

INSERT INTO table_name (column1, column2, ...., columnN) VALUES (value1, value2, ..., valueN);

Vietoje table_name įrašome savo lentelės pavadinimą, tada skliausteliuose išvardiname laukus, kuriuos norime užpildyti, ir po žodžio VALUES kituose skliausteliuose išvardiname reikšmes - atitinkamai tiek pat, kiek įrašėme laukų - column1 turi atitikti value1 reikšmę, column2 turi atitikti value2 reikšmę ir t.t.

Konkretus gyvenimiškas pavyzdys su daugiau laukų:

INSERT INTO users (name, surname, email, password, age, created_at, updated_at) 
  VALUES 
  ('Povilas', 'Testauskas', 'povilas@phppamokos.lt', 
   'lihcskfvhpfsafkjsdfsfad', 29, '2015-01-20 08:45:18', NULL);

Kokius dalykus galima čia pastebėti ir išskirti?

  • Tekstinės reikšmės rašomos tarp apostrofų (bet gali būti ir tarp dvigubų kabučių), o skaičiai gali būti rašomi ir be jokių kabučių. Tiesa, jei ir parašysite su apofostrofomis ar kabutėmis - vis tiek suveiks.
  • Laiko reikšmes įrašome YYYY-MM-DD HH:MM:SS formatu (jei laukas DATETIME tipo), bet jei nurodysime pvz tik datą, tai minutės ir sekundės būtų automatiškai priskirtos 00:00:00.
  • Laukas updated_at gali būti NULL (jei taip nurodyta kuriant lentelę), tai į jo vietą taip ir įrašome NULL. Bet galima to ir nedaryti, jei to lauko tiesiog būtume neįrašę, irgi suveiktų: INSERT INTO users (name, surname, email, password, age, created_at) VALUES ('Povilas', 'Testauskas', 'povilas@phppamokos.lt', 'lihcskfvhpfsafkjsdfsfad', 29, '2015-01-20 08:45:18');

Galimos klaidos

Kokios klaidos gali pasitaikyti dažniausiai ir ką su jomis daryti?

1. Neteisingas laukų arba reikšmių skaičius

INSERT INTO php_users (name, surname, email, password, age, created_at, updated_at) 
  VALUES 
  ('Povilas', 'Testauskas', 'povilas@phppamokos.lt', 
   'skfjhafhasdpifhsdakjh', 29);

Atsakymas:

MySQL said: Documentation #1136 - Column count doesn't match value count at row 1

Ar pastebėjote, kokią klaidą čia tyčią "įvėliau"? Prie reikšmių nėra created_at reikšmės - tai MySQL ir keikiasi, kad negali įvykdyti užklausos, nesutampa laukų ir reikšmių skaičius.

2. Neteisingas datos ar laiko formatas

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Testauskas', 'povilas@phppamokos.lt', 
   'skfjhafhasdpifhsdakjh', 29, '2015-13-12 08:47:16');

Įdomu, kad ši užklausa bus įvykdyta sėkmingai - nepaisant to kad nurodžiau 13-tą mėnesį. MySQL bandys eilutę konvertuoti į datą, ir jeigu nepavyks - tiesiog priskirs nulinių metų reikšmę: 0000-00-00 00:00:00.

3. Per ilga tekstinė eilutė

Sakykime, kad name laukas apibrėžtas kaip VARCHAR(10) ir bandome įvykdyti tokią užklausą:

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas Vytenis Vytautas', 'Testauskas', 'povilas@phppamokos.lt', 
   'skfjhafhasdpifhsdakjh', 29, '2015-12-12 08:47:16');

Ši užklausa bus įvykdyta sėkmingai ir klaidos neišmes. Bet vėliau jei pažiūrėsite koks vardas realiai išsaugotas - tai jis nurėžtas iki 10 simbolių: Povilas Vy.

Auto_increment ID laukas

Jau lentelių kūrimo pamokoje pasakojau apie id lauką, taip vadinamą pirminį raktą kuris su auto_increment užsipildo automatiškai. Kaip visa tai atrodo praktikoje, ir ką papildomai reikia žinoti?

Sakykime, kad mūsų lentelė ką tik sukurta ir turi tokį lauką id. Darome užklausą:

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Testauskas', 'povilas@phppamokos.lt', 
   'skfjhafhasdpifhsdakjh', 29, '2015-12-12 08:47:16');

Rezultatas - eilutė įterpiama, ir id laukas automatiškai lygus 1. Atkreipkite dėmesio, kad patys to lauko reikšmės nenurodėme.

Įterpiame dar vieną vartotoją:

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Antras', 'antras@phppamokos.lt', 
   'sfsalkfldfkalk', 19, '2015-12-12 09:47:16');

Nesunku nuspėti rezultatą - turime dvi eilutes su id reikšmėmis atitinkamai 1 ir 2.

O dabar įdomesnis variantas - kas vyks, jeigu mes visgi įterpiame tą id lauką ir priskiriame reikšmę didesnę už +1?

INSERT INTO php_users (id, name, surname, email, password, age, created_at) 
  VALUES 
  (994, 'Povilas', 'DarVienas', 'trecias@phppamokos.lt', 
   'dfgflsajfd,dskfdsjfk', 23, '2015-12-12 10:47:16');

Jokių problemų - įterpiama eilutė su mūsų nurodytu id.

Tai kas dabar įvyks jei įterpsime dar vieną eilutę be id? Ar naujos eilutės id bus 3, ar 995?

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Ketvirtas', 'ketvirtas@phppamokos.lt', 
   'dg,fgh;ladhdfhlakdsjh;ja;l', 20, '2015-12-12 11:47:16');

Kaip matote, MySQL peršoka prie didžiausios id reikšmės ir pradeda skaičiuoti jau nuo jos.

Dar vienas niuansas - kaip manote, kas bus jeigu ištrinsime tas eilutes su 994 ir 995, ir tada bandysime įterpti naują? Atsakymas - vis tiek naujosios id bus 996

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Penktas', 'penktas@phppamokos.lt', 
   'sdflsigliusdfsfhd', 40, '2015-12-12 12:47:16');

Kaip matote, id numeriai negrąžinami ir neatsilaisvina, tad jeigu bent vieną kartą buvo įterpta eilutė su tam tikru id, tai auto_increment veiks būtent nuo tos didžiausios reikšmės, ir ji niekada nemažės, nebent rankomis įterpsite kitokią id reikšmę.

Tiesa, yra dar vienas būdas nustatyti dabartinę AUTO_INCREMENT poziciją - tam skirta komanda:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Bet tokių dalykų daryti nerekomenduoju, ypač jei norite mažinti dabartinį AUTO_INCREMENT. Vat jei norite jį PADIDINTI - tada gal ir apsimoka. Reali situacija, su kuria pats esu susidūręs - kai yra priskiriami ID užsakymai ką tik atsidariusioje svetainėje, bet jos savininkai nenori, kad klientai žinotų jog jie patys pirmieji, tai dirbtinai lentelės pradžia startuoja nuo kokio nors atsitiktinio skaičiaus, pvz 349812.

Kelių eilučių įterpimas

Jei reikia įterpti kelias eilutes iš karto, gaunasi N sakinių, ir kiekvieną kartą reikia kartoti tą patį - laukų pavadinimus, žodžius INSERT INTO ir VALUES ir t.t. Laimei, galima tai padaryti ir su viena bendra komanda, štai taip:

INSERT INTO php_users (name, surname, email, password, age, created_at) 
  VALUES 
  ('Povilas', 'Pirmas', 'povilas@phppamokos.lt', 
   'sdflsigliusdfsfhd', 40, '2015-12-12 09:47:16'), 
  ('Povilas', 'Antras', 'antras@phppamokos.lt', 
   'sdflsigliusdfsfhd', 20, '2015-12-12 10:47:16'), 
  ('Povilas', 'Dar vienas', 'trecias@phppamokos.lt', 
   'sdflsigliusdfsfhd', 30, '2015-12-12 11:47:16'), 
  ('Povilas', 'Ketvirtas', 'ketvirtas@phppamokos.lt', 
   'sdflsigliusdfsfhd', 27, '2015-12-12 12:47:16');

Kaip matote, kiekviena reikšmių eilutė yra atskiriama kableliu, o sakinio pabaigoje tradiciškai kabliataškis.

UPDATE sakinys - atnaujiname duomenis

Dabar pakalbėkime apie tai, kaip duomenys yra atnaujinami - sakykime, jeigu mums reikia pakeisti konkrečios eilutės konkretų stulpelį. Tam skirta komanda UPDATE.

Jos sintaksė yra irgi gana paprasta (kaip ir visa SQL kalba, jūs dar to nejaučiate?), pažiūrėkime į pavyzdį:

UPDATE books SET title = 'Pavadinimas', author = 'Autorius' WHERE id = 1;

Arba, jeigu žiūrėsime abstrakčiau, komanda yra tokia:

UPDATE lentelė SET laukas1 = reikšmė1, laukas2 = reikšmė2 WHERE sąlyga;

Paprasta, ar ne? Po žodelio SET einantys laukai yra tie, kuriuos norime atnaujinti - jei kažkokio lauko keisti nenorime, tai tiesiog jo neminime šiame sąraše. O jei norime pakeisti tik vieną lauką tai ir kablelio nereikia, tiesiog laukas=reikšmė.

Po žodžio WHERE einanti sąlyga, iš esmės, yra tokio pat pavidalo: laukas=reikšmė. Būna ir sudėtingesnių sąlygų, bet apie jas kalbėsime kitose pamokose, kai nuodugniai nagrinėsime SELECT sakinį, kuris irgi turi WHERE sąlygą.

SVARBU: galima ir išvis nerašyti WHERE sąlygos - tada bus atnaujintos absoliučiai visos lentelės eilutės. Ir senos reikšmės dings negrįžtamai. Tad būkite labai atsargūs - netgi siūloma pradžioje parašyti WHERE sąlygą, o tik po to visą UPDATE užklausą, nes antraip gali būti bėdos.

Apie UPDATE sakinį daugiau nelabai yra ką papasakoti - štai toks gavosi apie jį mini-skyrelis.

Apibendrinimas

Štai, iš esmės, ir viskas, ką reikia žinoti apie INSERT/UPDATE komandas ir jos naudojimą. Taigi, mūsų lentelės jau pilnos duomenų - dabar galima pabandyti juos tinkamai ištraukti ir atfiltruoti! Apie tai kitoje pamokoje.



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