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