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