Insert v PostgreSQL 7.1.3

Karel Zak zakkr na zf.jcu.cz
Středa Únor 6 09:57:05 CET 2002


On Wed, Feb 06, 2002 at 09:00:37AM +0100, Pavel Tyrner 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 :-)

 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=...");
                                                ^^^

 Vetsina jazyku postavenych nad touto knihovnou obsahuje rozhrani k teto 
funkci. Napr. PHP se tato funkce jmenuje pg_GetLastOid.

        Karel
 
PS. pochopitelne je to v dokumentaci :-)

-- 
 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 Databases