MySQL a auto_increment

Karel Zak zakkr na zf.jcu.cz
Úterý Srpen 1 10:37:44 CEST 2000


On Tue, 1 Aug 2000, Vladimir Naprstek wrote:

> Miroslav Oravec wrote:
> 
> > Pri pouziti funkcie auto_increment, napr. "id" so zistil tuto vlastnost:
> >
> > -ked pridam zaznam, zvysi cislo o jeden
> > - ked zmazem zaznam, (napr. zo stredu tabulky), umaze "id"
> > - pri selecte zmazany zaznam vynecha, teda nezoradi znova od 1 do x po
> > jednom kroku. (napr. deletnem id=4, budu zaznamy 1,2,3,5,6,
> > - ak pridam novy zaznam, volne miesto sa vyuzije, teda bude poradie
> > 1,2,3,7,5,6.
> >
> > Ako urobit, aby po zmazani zaznamu, "prepocital" id na spravne hodnoty
> > vzostupne a novo pridany zaznam pripojil na koniec a nie na uvolnene
> > miesto?

 To muzete udelat tim, ze po kazde zmene te tabulky udelate 
select ... into jina tabulka a behem toho si ta id precislujete.

Pokud chcete, aby id nebylo pridelovano jako increment v ramci nejake
ciselne rady, ale naopak aby se vzdy pouzilo nejake volne misto v te rade
tak v lepsich SQL je mozne si napsat trigger, ktery bude ta id pridelovat 
tak, ze se budou pouzivat "diry" v te rade. Neco takoveho tu mam v
PostgreSQL, ale je to *hodne* casove narocne na insert/update a pokud to
opravdu nepotrebujete tak bych byt vami nic takoveho nedelal.

 Dalsi veci (i kdyz o tu vam asi neslo) je fyzicka organizace tabulky podle
nejakeho klice (indexu) to lze u nekterych SQL udelat pomoci prikazu
CLUSTER. 

 Jinak pokud vam jde o zachovani nejake posloupnosti pri pridavani zaznamu
tak si tam prece muzete pridat sloupecek s casem, urcite to bude lepsi nez
vyse popsana alchymie s ID. 

> Mohu se zeptat, proc Vam vadi, ze zaznamy jsou "uvnitr tabulky
> poprehazene"? Cisla auto_incrementu jsou dobre, vyhledat je muzete, ziskat
> ve spravnem poradi take....

 Take si myslim. Pekne na SQL je ze muzete dostavat data dle logickych 
pozadavku a ne fyzickych tak jak je to napr. na disku ...apod.

> Jestli Vam vadi, ze po smazani id=4 a po pridani noveho zaznamu se ona
> ctyrka opet nepouzije, tak to Vam neudela zadna databaze automaticky

vsechno jde :-), ale bezne to nebude.

> (alespon doufam). Muze se Vam totiz lehce stat, ze na onu ctyrku budete mit
> v jine tabulce vazbu a pri smazani nadrizeneho zaznamu neopravite podrizeny
> zaznam. Bordel ktery by Vam potom vznikl by mohl byt dobrou nocni murou.

 To snad asi ne, opravdove SQL maji moznost definice toho co se stane pokud
DELETE/UPDATE zaznam, ktery je vazan nejakou vazbou. 

viz. REFERENCES ... ON DELETE [ CASCADE ...apod ]

> Pokud NUTNE potrebujete, aby id sla "po sobe", musite si mazani a update id
> zbylych zaznamu zaridit sam....
> 
> Pokud budete patrat po dalsich vlastnostech autoincrementu, tak zkuste
> smazat posledni zaznam a pak hned dalsi pridat...

 Jeste snad dodatek, nektere SQL umoznuji definici SEQUENCE, ktera se pak da
pouzivat na misto toho zvrhleho auto_incrementu v MySQL a lze ho mit pod
daleko vetsi kontrolou.

 IMHO je nutne pozadavkum na datovy model prizpusobit vyber SQL DB :-) 

				Karel



Další informace o konferenci Test