posledni automaticky generovany id a prenositelnost
Karel Zak
zakkr na zf.jcu.cz
Úterý Srpen 10 10:05:11 CEST 2004
On Mon, Aug 09, 2004 at 09:22:26PM +0200, Zdenek Janis wrote:
> Karel Zak napsal(a):
> > Prave proto existuji na nekterych DB platformach
> > veci jako jsou sequence (Oracle, PostgreSQL, Firebird). Specialni
> > datove typy (MySQL, serial v PostgreSQL) jsou v tomdle dost
> > nestastne,
>
> Neznam cele vlakno dotazu, ale serial a bigserial vnitrne vytvareji
> sequencer pri create table a taky jej pouziva...
>
> Takze me udivuje, ze na jednom radku sequencer vychvalujete
> (preferujete) a o radek nize jej nazyvate nestastnym.
Jiste vytvareji sequenci, ale kde mate garanci jejiho jmena, ktere
muzete pouzivat v nextval/curval()? Proste v pripade SERIAL je to mimo
vase moznosti a zatahujete si do aplikace neco co je mimo veci ktere
muzete ovlivnovat. Proste pouzivat SERIAL jako sequenci je jako drbat
se pravou rukou za levym uchem s urcitou nejistotou, ze ta ruka to
ucho vubec najde... SERIAL ma svuj vyznam pokud pristoupite na jeho
pouzivani podobne jako autoincrement v MySQL.
On Tue, Aug 10, 2004 at 09:09:50AM +0200, Michal Hlavac wrote:
> Zdenek Janis wrote:
> >Presto mi unika zakladni problem ;-) (Posledni dobou dost casto ;-))
> >
> >Klidne mohu pouzit typ (big)serial v tabulce a pak:
> >1) klidne to tabulky vlozit zaznam a nechat, aby se tam samo
> >vygenerovalo ID (napr.) a jeho hodnotu ziskam pohodlne volanim pres
> >currval(seq).
> >2) A nebo proste nejdrive zavolam nextval(seq) a pak to puziju do
> >insertu v tabulkach.
> >
> >Me se jevi oba postupy stejne "narocne".
> >Osobne stejne nejacasteji pouzivam funkci, ktera vlozi zaznam a vrati ID.
>
> (1) No, zase tak 100% ekvivaletne to nie je...
> Ten prvy sposob, teda:
> premena := nextval(seq);
> a teraz robim inserty s premennou...
Jde o to, ze tento zpusob je z hlediska kodu aplikace vetsinou i
cistci, protoze casto to ID pouzijete v nekolika ruznych dotazech a
IMHO je to elegantnejsi nejakou funkci si nechat vytvorit ID a pouzivat
ho nez udelat INSERT a pak nekde lovit dalsim dotazem co tam DB
dala. Ostatne "SELECT nextval()" bude i vyrazne rychlejsi nez hledat v
nejake rozsahle tabulce posledni INSERT. Takze, alespon pro mne to neni
urcite jen o pocitu, ale ma to i prakticke duvody.
> (2) Druhy sposob:
> INSERT INTO tabulka VALUES (nextval(seq), ...)
> a teraz sa pytam na curval(seq) a pouzivam ho...
>
> Na prvy pohlad sa to zda rovnako... Az na to, ze (2) musim vykonat v
> jednej transakcii... Pretoze, co ak mi v (2) niekto medzi insertom a
> curval vykona dalsi insert... Na curval(seq) dostanem zle cislo...
> Kdezto (1) nemusim vykonavat v jednej transakcii...
Obazam se, ze (2) ve vasem podani je neporozumneni...
Doporucuji archiv teto konference. Sequence (v PostgreSQL, ale asi i
jine rozumne implementovane) jsou _mimo_ transakce a aktualni session
si vzdy pamatuje hodnotu sequence kterou naposledy pouzila a to zcela
bez ohledu na to co se sequenci delaji ostatni sessions.
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
Další informace o konferenci Test