Unikátny identifikátor záznamu v tabuľke

Už skorej sme si povedali, že jednotlivé riadky v tabuľke nie sú identifikovateľné podľa vizuálneho (virtuálneho) poradového čísla v tabuľke, tak ako by sme si to mysleli pri pohľade na tabuľku v sekcii browse. Záznamy v tabuľke reprezentujú len ich hodnoty, t.j. hodnoty konkrétnych stĺpcov, na ktoré sa vieme následne odkazovať napríklad v klauzule WHERE. Aby boli teda riadky v našej tabuľke jednoznačne identifikovateľné, vytvorili sme si prvý stĺpec s názvom ID, kde ukladáme pre každý nový záznam číslo o jedno väčšie, čiže je to akokeby taký ručný unikátny identifikátor.

 

Pozastavil by som sa nad slovom unikátny. Toto číslo nám reprezentuje daný riadok a toto číslo nemôže obsahovať žiadny iný riadok. Čo keď sa však niečo stane, budeme mať veľa záznamov a nebudeme vedieť, ktoré číslo je posledné alebo omylom vložíme riadok dvakrát s tým istým číslom ID? Ak by sme teraz vykonali príkaz INSERT INTO a použili by sme číslo v stĺpci ID, ktoré sa už v tabuľke nachádza, príkaz by sa vykonal korektne. My by sme ale vedeli, že to nie je správne a že sme spravili chybu. Stratili by sme tým unikátny ukazovateľ pre jednotlivé riadky.

 

Práve preto je možné pri stĺpci nastaviť vlastnosť s názvom UNIQUE (unikátny), ktorá hovorí o danom stĺpci, že môže obsahovať iba unikátne hodnoty, teda žiadne dva riadky nemôžu mať v tomto stĺpci rovnakú hodnotu. Pri pokuse o vloženie záznamu, ktorá obsahuje už takú hodnotu v tomto stĺpci, ktorá sa v ňom nachádza, sa príkaz vďaka tejto vlastnosti nevykoná a máme tým pádom zabezpečené, že sa bude jednať skutočne a unikátny identifikátor pre našu tabuľku.

 

Vlastnosti stĺpcov (je ich viac, dostaneme sa k tomu neskôr) sa zadávajú pri definovaní tabuľky (CREATE TABLE) a zadávajú sa za typom dátového typu stĺpca. Naša tabuľka je už ale vytvorená a nejdeme ju mazať a znova vytvárať. Štruktúru tabuľky je možné dodatočne (už po jej vytvorení aj s obsahujúcimi dátami) modifikovať pomocou príkazu ALTER TABLE (zmeniť tabuľku), za ktorým nasleduje názov tabuľky. Následne sa zadáva príkaz na konkrétnu zmenu, týchto príkazov je viac, my potrebujeme momentálne príkaz ADD (pridať), ktorý slúži na pridanie vlasnosti nejakému stĺpcu. Za týmto slovom zadáme názov vlastnosti (UNIQUE) a do zátvorky uvedieme názov stĺpca, na ktorý chceme aplikovať túto vlastnosť. Náš príkaz bude teda vyzerať nasledovne:


ALTER TABLE `users` ADD UNIQUE(`id`);


Po vykonaní tohto príkazu sa prepnite do sekcie structure v našej tabuľke. Všimnite si rozpis stĺpcov a na konci riadka každého z nich je možnosť označiť stĺpec, či bude UNIQUE. Ako vidíte, prvý stĺpec (id) po našom query už túto vlastnosť má nastavenú. Poďme si vyskúšať, aký to má pre nás význam a či to skutočne robí to čo chceme, skúsme sa pokúsiť vložiť id, ktoré už v tabuľke máme, napríklad týmto príkazom:


INSERT INTO users (id,user_name ,user_surname) VALUES (1,'Charlie','Harper');


Po vykonaní tohto príkazu dostaneme chybnú hlášku s textom duplicate entry 1 for key id, čo nám hovorí, že chceme vložiť duplicitnú (už existujúcu) hodnotu 1 pre kľúč v stĺpci ID. Kľúčom sa označujú stĺpce, ktoré sú typu UNIQUE, pretože je to akokeby kľúč k danej tabuľke, podľa týchto kľúčov vieme jednoznačne pristupovať ku ktorémukoľvek záznamu.

 

Pridanie tejto vlastnosti pre stĺpec ID nám zabezpečilo, že sa v ňom skutočne budú nachádzať unikátne hodnoty. V SQL existuje ešte jedna vlastnosť, ktorá nám v tomto prípade uľahčí prácu. Ako sme povedali, chceme pre každý nový záznam vkladať číslo o 1 väčšie od posledného záznamu. Pri takomto manuálnom spôsobe by sme teda pri každom pokuse o vloženie nového záznamu potrebovali vedieť, aké číslo nesie posledný záznam a zväčšovať ho o jedna. Tento spôsob je dosť pracný a manuálny a hlavne zbytočný.

 

SQL totižto ponúka vlastnosť pre stĺpec s názvom AUTO INCEREMENT (automatický prírastok), ktorá nám zabezpečí to, že pri vkladaní nemusíme špecifikovať (zadávať) túto hodnotu (stĺpec) a SQL nám to samo vloží s tým, že k hodnote posledného záznamu pripočíta číslo 1. Kombinácia tejto vlastnosti spolu s vlastnosťou UNIQUE je pre prvý identifikačný stĺpec v každej tabuľke bežná praktika. Táto vlastnosť sa však nedá pridať pomocou príkazu ADD v príkaze ALTER TABLE, ako to bolo v prípade vlastnosti UNIQUE.

 

Pre pridanie tejto vlastnosti k nášmu stĺpcu musíme použiť príkaz CHANGE (zmeniť), ktorý je tiež súčasťou príkazu ALTER TABLE, jeho syntax je však odlišná. Za týmto príkazom zadávame názov stĺpca, ktorý chceme zmeniť a následne zadávame celú definíciu stĺpca (tak ako to zadávame pri CREATE TABLE), čiže názov, dátový typ a vymenované vlasnosti. Náš príkaz na pridanie vlasnosti AUTO INCREMENT by teda vyzeral takto:


ALTER TABLE users CHANGE id id BIGINT AUTO_INCREMENT;


Týmto príkazom sme stĺpec id nadefinovali nanovo (zmenili sme ho), ale použili sme v podstate tú istú definíciu ako pri vytváraní tabuľky, iba sme mu pridali vlastnosť automatické zvyšovanie hodnoty. Prepnite sa do sekcie structure a všimnite si, že pri našom stĺpci id je v stĺpci extra napísané, že obsahuje túto vlastnosť. Keď sa nám to podarilo úspešne nastaviť, poďme si to aj vyskúšať, či to funguje. Skúsime teda pridať nový záznam bez zadania hodnoty prvého stĺpca:


INSERT INTO users (user_name ,user_surname) VALUES ('Janko','Mrkvicka');


Po vykonaní tohto príkazu dostaneme hlášku o úspešnom vložení záznamu a taktiež dostaneme info, s akým id sa vložil daný záznam (inserted row id:5). Keď sa prepneme do sekcie browse, náš záznam sa skutočne v tabuľke nachádza pod identifikačným číslom 5. Šikovné nie? Pomocou týchto dvoch vlastností sme si zabezpečili, že tento stĺpec bude za každých okolností slúžiť ako jednoznačný identifikátor pre záznamy v našej tabuľke a okrem iného sa nemusíme starať o jeho hodnoty. Stačí nám vkladať len hodnoty ostatných stĺpcov a id sa bude automaticky zvyšovať. Toto číslo sa však nezvyšuje podľa posledného čísla, ktorý sa aktuálne nachádza v tabuľke, ale podľa posledného, ktoré sa kedy nachádzalo v tabuľke. To znamená, že ak by sme tento záznam zmazali a pridali nový, nebude mať číslo 5, ale číslo 6. Ide o to, aby sa v tabuľke ani raz nenáchadzali iné záznamy pod rovnakým číslom, aj keď tam už nie sú. Význam tohto pochopíte troška neskôr, to len aby ste sa nečudovali, ak vám medzi záznamami vznikne medzi číslami väčšia medzera ;-)

 

Ešte si povieme len jednu vec. Niekedy chceme, aby sa naše záznamy číslovali od nejakého špecifického čísla. Pri tejto vlastnosti je možné určiť, od ktorej hodnoty sa bude počítať, resp. od ktorého čísla začne zvyšovať. Toto sa využíva, ak chceme napríklad číslovanie od čísla 100 alebo 1000 alebo ak z nejakého dôvodu potrebujeme začať číslovať od nejakého vyššieho čísla (naša tabuľka je možno z nejakého dôvodu pokračovanie inej tabuľky, kde už sú nejaké dáta vložené pod nejakými číslami a nie je možné v nej pokračovať a podobne). V tomto prípade môžeme pri zadávaní tejto vlastnosti špecifikovať počiatočné číslo pre zvyšovanie tým, že k vlastnosti pridáme znamienko rovná sa a zadáme číslo, od ktorého chceme počítať. Toto ale v našom prípade nateraz nepotrebujeme, len sme si o tom povedali, aby ste vedeli, že je taká možnosť.

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

sql uniquesql auto incrementuniqueauto incrementunikatny udajzvysovanie o jednoinkrementaciaprimarny klucprimary key

IT ftip

Čo majú spoločné pevný disk a minisukňa? Krátku prístupovú dobu.