Ciselna rada po uzivatele
Pavel Stehule
stehule na kix.fsv.cvut.cz
Středa Prosinec 17 15:16:08 CET 2003
Pro mysql vubec netusim. Pro PostgreSQL bych teoreticky mohl bez pouziti
ulozenych procedur se vejit do dvou prikazu
BEGIN
INSERT INTO tab SELECT FOR UPDATE;
UPDATE ..
END;
s pouzitim vlastni funkce s vedlejsim efektem
CREATE OR REPLACE obj(text) RETURNS integer AS '
DECLARE id AS integer;
BEGIN
SELECT id INTO id FROM .. WHERE neco=$1 FRO UPDATE;
UPDATE tab SET id = id + 1 WHERE neco = $1;
RETURN id;
END; 'LANGUAGE plpgsql;
a pak INSERT INTO ibjed VALUES (obj('prijmeni'));
ale je to v podstate prepis pouze prvni varianty. Jenomze mysql nema
ulozene procedury, takze jsem Vam vubec nepomohl :-(.
Pavel Stehule
On Wed, 17 Dec 2003, Zdenek Bohm wrote:
> > Zkuste napsat vic, netusim jakou mate databazi, co chcete delat s temi
> > cisli. Obecne by se to mohlo vyresit asi takto
> >
> > BEGIN
> > SELECT cislo FROM tab WHERE id=neco FOR UPDATE;
> > ......
> > ......
> > UPDATE tab SET cislo = CISLO + 1 WHERE id=neco;
> > COMMIT;
>
> Pardon, mel jsem se vic rozepsat. Cele to bezi na MySQL. Vyse zmineny
> postup s vyselektovanim posledniho cisla, jeho inkrementovanim a
> naslednym pridanim zaznamu me taky napadl. Ale rad bych to prave takto
> neudelal.
> Jde o tabulku do niz se ukladaji hlavicky objednavek - uzivatel jehoz
> udaje jsou ulozeny v jine tabulce svazane s touto pres ID_Uzivatel si
> neco objedna a do teto tabulky je ulozen zaznam, ze to byl on, kdy to
> udelal atd. a krome toho, pro dohledani je teto objednavce prirazeno cislo.
> Nejjednoduseji to samozrejme jde udelat tak, ze sloupec Cislo se
> nadefinuje jako AUTO_INCREMENT a pak kdyz vlozim do tabulky dalsi zaznam
> , automaticky se ji priradi dalsi cislo v poradi. Ovsem za situace, kdy
> chronologicky objedna uzivatel s ID=1, pak uzivatel s ID=2 a pak zase
> ten s ID=1 bude vysledek ten, ze uzivatel s ID=1 bude mit objednavky
> cislo 1 a 3 a uzivatel s ID=2 bude mit objednavku s cislem 2. Ja bych
> prave rad docilil stavu, kdy kazdy uzivatel by mel vlastni neprerusenou
> ciselnou radu objednavek. Proste aby patnacta objednavka uzivatele 1
> mela cislo 15 bez ohledu na to, kolik jinych uzivatelu mezitim objednalo.
> A docela by se mi hodilo, pokud by to slo udelat jen prostrednictvi
> jednoho INSERTU do vhodne nadefinovane tabulky (neco jako AUTO_INCREMENT
> jehoz "nejblizsi volnou" hodnotu ovlivnuje take obsah sloupce
> ID_Uzivatel). Bohuzel me nenapadlo (ani jsem nikde nenasel), jak by to
> slo zaridit (jestli vubec...), proto se ptam.
>
> S pozdravem Zdenek Bohm
>
Další informace o konferenci Databases