Pouziti autoincrementu

Honza Pazdziora adelton na informatics.muni.cz
Čtvrtek Červen 19 11:34:34 CEST 2003


On Thu, Jun 19, 2003 at 02:55:33AM +0200, Petr Vileta wrote:

> Ja bych rad pouzival autoincrement, jenze on je trochu hloupy.
> create table test(cislo int(10) autoincrement, neco varchar(20));
> insert into test set neco='ABC';
> insert into test set neco='DEF';

Ufff, piste prosim ty priklady tak, aby si to lidi mohli vzit mysi
a vyzkouset ...

> select * from test;
> |0|ABC|
> |1|DEF|
> select max(cislo) from test;
> # vysledek nactu do promenne $posledni (v Perlu)
> delete from test where cislo=$posledni;
> insert into test set neco='XYZ';
> select * from test;
> |0|ABC|
> |2|XYZ|
> 
> Evidentne jsem chtel smazat posledni zaznam a pridat dalsi, ale tak aby rada
> navazovala. Jenze bez sachovani s last_insert_id() se mi to nepodari. A to

No, evidentne jste chtel, aby kdyz smazete cislo z prostredka, aby Vam
databazovy stroj precisloval vsechna cisla nad tim? To snad ne.

> jsem uvedl velmi jednoduchy pripad, kdy jsem mezi tim nedelal zadny jiny
> select nad jinou tabulkou. Pak muzu na last_insert_id() zapomenout uplne.
> Kdyz jsem se MySQL ucil, tak jsem samozrejme autoincrement s ndasenim uvital
> (prechazel jsem z Foxpro), ale zase jsem ho honem rychle opustil, protoze
> komplikace desny :-)

To chovani, ktere popisujete, melo MySQL asi pred tremi lety, a byla
to chyba, a byla opravena. Protoze pokud ma byt auto_increment aspon
trosku jako sekvence, tak nesmi vydat jedno cislo dvakrat po sobe.

Vy motate dohromady dve ruzne veci: chovani sekvenci a auto_incrementu
jako nastroje na generovani posloupnosti cisel, a integritni omezeni
toho schematu, kdy pozadujete, aby to bylo imunni dokonce i proti
smazani. Na vytvareni novych zaznamu a generovani primarnich klicu
(neviditelnych technickych nastroju) slouzi databazove prostredky
auto_increment a sekvence, _nikoli_ zamykani tabulek. Na vytvareni
nederavych sekvenci ciselnych dokladu musite pouzit jine pristupy,
nastesti ale zase bez zamykani tabulek. Namatkou: vygenerujte si ta
cisla dokladu do tabulky

	id_dokladu	integer			unique
	cislo_dokladu	integer not null	primary key

a cislo dokladu pak nove vytvorenemu zaznamu v tabulce zaznamu
pridelite jedinym nezamykacim updatem.

Mimochodem, i kdybych pristoupil na Vasi hru, ze chcete, aby nederava
sekvence prezila delete, tak delete rozhodne neni korektni operace nad
ucetnimi doklady, ze, narozdil od storna a dobropisu a jinych.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, auth. WWW servers, XML/XSL, ...
		Only self-confident people can be simple.


Další informace o konferenci Databases