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