Insert v PostgreSQL 7.1.3

Radek Kanovsky rk na dat.cz
Středa Únor 6 10:07:48 CET 2002


On Wed, Feb 06, 2002 at 09:57:05AM +0100, Karel Zak wrote:

> > Dobry den,
> > prosim o radu pro tento pripad:
> > Mam tabulku, kde je m.j. pole ID, ktere je serial a tudiz se pri INSERTu
> > zaznau do tabulky automaticky zvysuje jeho hodnota o 1. To vse funguje k me
> > radosti v pohode :o).
> > Potrebuji ale hned v nasledujicim kroku znat hodnotu onoho pridaneho ID. Da
> > se to nejak vycist hned po prikazu "INSERT INTO.......", nebo musim delat
> > nasledne jeste "SELECT ID ..... ORDER BY ID DESC LIMIT 1", cimz zjistim
> > nejvysii (a tudiz posledni) hodnotu ID? Z tohoto SELECTU mam totiz obavy: co
> > kdyz ve stejnou chvili (je to malo pravdepodobne, ale co kdyz...) vlozi do
> > tabulky jeste nekdo dalsi zaznam, pak mi je onen SELECT na nic.....
> 
>  Heh... dostal jste par vesmes spatnych rad. Dam vam lepsi :-)
 
Rekl bych, ze to zalezi na situaci.

>  Kazdy dotaz typu INSERT vraci OID, ktere je unikatni pro danou radku
>  a udrzovane PG nezavisle na definici tabulky. Pokud se podivate do 
>  klientske klihovny najdete tam:
> 
>  * PQoidValue Returns the object id of the tuple inserted, if the SQL
>    command was an INSERT. Otherwise, returns InvalidOid.
> 
>    Oid PQoidValue(const PGresult *res);
> 
>  Zjednodusene pouziti muze byt:
> 
>  res = PQexec(conn, "INSERT INTO mojetab VALUES (....)");
>  oid = PQoidValue(res);
>  ^^^
> 
>  PQexec(conn, "SELECT id FROM mojetab WHERE oid=...");

Podle me ten prvni zpusob bude efektivnejsi (a mozna i prenositelnejsi,
ale to malokoho zajima :-), protoze ten prvni SELECT CURVAL... se musi
udelat stejne. Vami (a mnou) navrhovany zpusob ma opodstatneni tehdy,
pokud potrebuju zjistit i hodnoty polozek, ktere jsou nastavovany triggery
nebo maji defaultni hodnotu, ktera neni konstanta (DEFAULT NOW() apod.).

Radek Kaňovský


Další informace o konferenci Test