Pouziti autoincrementu

Karel Zak zakkr na zf.jcu.cz
Čtvrtek Červen 19 09:43:11 CEST 2003


On Thu, Jun 19, 2003 at 02:33:18AM +0200, Petr Vileta wrote:
> > No a co když se něco stane (výpadek sítě, atd) někde mezi zamčením a
> > odemčením tabulky?
> No pokud mi nekde bezi MySQL server a na datech mi alespon trochu zalezi,
> tak to PC je docela urcite napajene z UPS :-) No a pokud dojde k vypadku
> proudu, tak to UPS chcili udrzi a potom vyda serveru povel na zavreni vsech
> aplikaci a tim se tabulka automaticky odemkne (alespon si to myslim, nemam
> vyskousene).

 Na tomto nemuzete, ale stavet zadny vetsi a hlavne stabilni IS. Co
 kdyz vam nekdo vytahne napajeci kabel? Konzisence a moznost zacit
 pracovat po predeslem padu by IMHO mela byt zajistena samotnou DB.

On Thu, Jun 19, 2003 at 02:39:27AM +0200, Petr Vileta wrote:
> >  Bohuzel LOCK cele tabulky je prikaz, ktery je v seznamu zadoucich
> >  operaci hodne hluboko. Prirovnal bych to ke "goto" :-) Neco takoveho
> >  se da pouzivat jen v pripadech kdyz uz neni jina cesta.
> >
> >  Pro INSERT to bude mozna dobre, ale co kdyz tam bude jeste nekolik
> >  dalsich klientu chtit provadet UPDATE? Proc blokovat dalsi operace,
> >  kdyz problem, ktery tim resite (nove ID) se techto operaci netyka?
> No pokud delam inzert a to je jedina operace, kdy to potrebuju zamknout, tak
> si ostatni nekolik milisekund pockaji. Nebo si pockam ja s tim LOCKem, nez

 Problem DB systemu je, ze cim vetsi zatez tim vice jsou ty prodlevy
 zretelnejsi. To je-li to "nekolik milisekund" nezalezi jen na DB, ale
 treba se zrovna uprostred vaseho zamku rozhodne kernel OS delat uplne
 neco jineho a pak se vam vsechno todle sejde v jednom uzkem hrdle :-)

On Thu, Jun 19, 2003 at 03:28:23AM +0200, Petr Vileta wrote:
> Predstavte si databazi osob s osobnimi cisly, ktera vypada po nekolika
> mesicich takto:
> 1        Novak
> 24      Vileta
> 286    Sverak
> 1238  Hardaba
> 1326  Novotny
> Vas by netrefil slak, kdyz budete mit ID typu mediumint, ale v tabulce nikdy
> nebude vic, nez treba 100 jmen? :-)

 Jde o to co resite. Autoincrement/sequence resi prideleni unikatniho
 cisla - a presne to delaji a pro ucel za jakym se PK pouvaji to
 staci.

> Pro te prilezitosti me napadlo, ze by MySQL a databaze obecne mohly
> obsahovat funkci FIRST_FREE(), ktera by vratila z pole ID prvni neobsazene
> cislo, v uvedenem prikladu tedy 2 :-)

 Mam jiz par let v chodu system z ktereho by jste mel radost. Jsou tam
 generovana UID pro ucty uzivatelu a jelikoz rozsah tech cisel je
 omezeny tak se "recykluji" (je to pochopitelne dost neprakticke,
 protoze lepsi by bylo mit urcitou prodlevu nez se to stare UID
 pouzije znova). Je to dost obludnost a neumim si predstavit neco
 takoveho pouzivat u bezneho PK.

> Jedina cesta, jak svazat tyto lidi s konkretni firmou je, ze kazda osoba
> bude mit v zaznamu i ID firmy. Takze zapisu novou firmu a potrebuji pridelit
> nove ID, ale to potrebuju i znat a pouzit v jinych tabulkach.
> Uz jsem videl hodne ruznych reseni, ale to moje mi zatim vychazi
> nejbezpecnejsi a take nejrychlejsi na zpracovani, ackoliv to na prvni pohled
> vychazi opacne.
> No schvalne, jak to resite vy?

 SELECT nextval('seqname');
 
 A nasledne to ID az do uplneho omrzeni pouzivam ve vsech dalsich
 dotazech kde je to treba.
 
    Karel

-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/


Další informace o konferenci Databases