Pouziti autoincrementu

Karel Zak zakkr na zf.jcu.cz
Středa Červen 18 09:34:31 CEST 2003


On Tue, Jun 17, 2003 at 08:38:55PM +0200, Petr Vileta wrote:
> >  Jak vlastne treba u DB2 nebo MySQL dostanu nejake ID jeste pred tim
> >  nez neco vlozim do tabulky?
> No tak konkretne u MySQL to delam takhle:
> LOCK TABLE moje_tabulka WRITE, jina_tabulka WRITE;
> SELECT MAX(nejake_ciselne_pole)+1 FROM moje_tabulka;
> INSERT INTO moje_tabulka SET nejake_hodnoty;
> INSERT INTO jina_tabulka SET nejake_hodnoty;
> UNLOCK TABLES;
> Tim mam zarucene, ze behem zjistovani ID mi nikdo jiny do tablek nic
> nezapise, ale muze cist. Takze pokud jiny thread chce nacist data pro
> zobrazeni, nic u nebrani a pokud chce neco zapsat, tak proste ceka, dokud ja
> neskoncim se zapisem a neUNLOCKnu.

 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?

 Proto je lepsi prenest toto reseni do samostatne tabulky, ktera bude
 resit jen to ID. Tedy reseni kteremu se rika sequence. A uplne
 nejlepsiho vykonu dosahnete pokud ta tabulka starajici se o ID bude
 obsahovat jen jedno ID a bude mozne tato ID generovat po blocich,
 takze session, ktera o to pozada dostane najednou treba pet ID a do 
 te tabulky si pujde pro dalsi az tech pet spotrebuje.
 
 Pochopitelne to vse za predpokladu, ze vam nevadi "diry" v te
 generovane posloupnosti.

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


Další informace o konferenci Test