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 Databases