Insert v PostgreSQL 7.1.3

Karel Zak zakkr na zf.jcu.cz
Středa Únor 6 11:25:22 CET 2002


On Wed, Feb 06, 2002 at 11:04:04AM +0100, Radek Kanovsky wrote:

> > Funkcni modifikace toho napadu je udelat INSERT a pak az nasledne 
> > SELECT currval():
> > 
> > test=# INSERT INTO xxx (data) VALUES ('one');
> > INSERT 45419 1
> > test=# SELECT currval('xxx_id_seq');
> >  currval
> > ---------
> >       11
> > (1 row)
> > 
> > test=# SELECT * FROM xxx;
> >  id | data
> > ----+------
> >  11 | one
> > (1 row)
> 
> Toto neni funkcni protoze mezi INSERT a SELECT muze byt INSERT od
> dalsiho klienta, ktery sekvenci inkrementuje.

 Zkousel jste to? Jste si jist tim co vraci funkce currval()?
 
 Znova: nextval() vezme seq. a zamluvi si cislo pro *danou session*
        funkce currval() pak vzdy v dane session vraci hodnotu, kterou
        vratil posledni nextval(). A to i tehdy pokud jiny klient
        inkrementoval sequenci. Hodnota z nextval() je tedy v dane
        session cachovana az do pouziti dalsiho nextval() v dane
        session.
        
        Pro neverici tomase:

Klient A:

        # SELECT nextval('xxx_id_seq');
         nextval
        ---------
              24
        (1 row)

 
Klient B:

        test=# SELECT nextval('xxx_id_seq');
        nextval
        ---------
        25
        (1 row)

Klient A:

        test=# SELECT currval('xxx_id_seq');
         currval
        ---------
              24
        (1 row)

 
> >  BTW, je vhodne si taktez uvedomit, ze sequence jsou mimo transakce.
> 
> Proto nefunguje vas posledni priklad uplne vzdy.

 Opravdu?

        Karel
-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/
 
 C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz


Další informace o konferenci Test