Newsgroup: it.comp.software.database
Titolo: [Postgres]Ultima id inserita?

Ciao a tutti,
ho il seguente problema. 
Sto creando un'applicazione web in java (jsp+servelt etcc...) che si 
interfaccia a postgresql. 
Al momento non sono molto skillato su pg, lo sono molto di piu' su firebird 
e mysql, e dalla doc non sono riuscito ad estrapolare l'informazione che mi 
serve.
Dopo l'inserimento di un nuovo record in una tabella con un campo serial, 
come faccio ad ottenere il valore del campo serial?
Mi spiego:
tabella user:
id serial
nome varchar.
inserisco nome, automaticamente lui crea un valore per id unico. 
Dove pesco questo valore?
Grazie per l'attenzione e le risposte.
FRANK
-- 
frank@office

 nome varchar.
sbagli il concetto di base...
su postgres, come su Oracle, ci sono le sequences.
create sequence pippo_seq;
create table pippo ( id integer default=nextval('pippo_seq'),
        nome varchar(20));
(non mi ricordo se per il default ci va l'=).
una volta che inserisci un record ti basta fare:
select curval('pippo_seq');
ciao e bon postgres.
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/philosophy/no-word-attachments.it.html

come faccio ad ottenere il valore del campo serial?
Brutto e pericoloso:
	select last_value(nometabella_seq);
oppure, piu' corretto, usando le transazioni come prudenza domanda:
	BEGIN WORK;
	INSERT INTO user (...) VALUES (...);
	SELECT CURRVAL('user_seq');
	END WORK;
Leonardo
-- 
".signature": bad command or file name

 
Questo posso passarlo intero al jdbc o devo smontarlo in piu' query?
Beh, ci provo...
FRANK
-- 
frank@office

 FRANK
non so.
su PHP posso usare 4 query distinte e la transazione me la tiene in pancia.
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://php.dopoil.com

 
:))
lo so. sono "bilingue". o meglio, sono piu' php che java.
-- 
frank@office

	END WORK;
Se non ci sono transazioni contemporanee o si puo' implementare una
semaforica di qualche tipo, il primo modo (sudicio) e' piu' veloce.


Leonardo Serni il Wednesday 05 June 2002 16:55 scrisse:

Un'altra soluzione.
id = "SELECT nextval('nometabella_seq');"
...
INSERT INTO tabella (id...)
il select nextval dalla sequenza mi fornisce l'id ed incrementa la 
sequenza, quindi l'id e' unico. Un altro processo ottiene un id diverso.
Giusto o no?
FRANK
-- 
frank@office

 INSERT INTO tabella (id...)
niente male!!!
fammi pensare un po'...
così quando uno si becca il nextval, sa già che valore avrà. e un altro 
non lo può prendere perché sempre usando il nextval, avrà un altro id!!!
a dir poco ottimo!!
ciao
-- 
Punkarruso
mail:punkarruso(at)geniotradottoininglese(dot)it
pubblicità progresso:
http://www.gnu.org/philosophy/selling.it.html

 a dir poco ottimo!!
e' quello che usavo per oracle. o meglio che usava chi me lo ha insegnato. 
Il concetto e' che se non mi serve l'id, essendo il campo collegato di 
default alla sequenza, viene inserito un valore unico senza specificarla. 
Se mi serve sapere prima l'id uso questo metodo.
saluti,
FRANK
-- 
frank@office

Giusto o no?
Quando posso, io faccio cosi'. Per insert multipli, ad es., pero'...


 Leonardo
pero' cosa?
-- 
frank@office

pero' cosa?
Se fai una cosa del tipo
	INSERT INTO ... SELECT ...
non puoi recuperare gli ID, a meno di fare dei magheggi con le transazioni
e/o usare una tabella temporanea per immagazzinare gli ID.


Leonardo Serni il Thursday 06 June 2002 19:33 scrisse:

Vero, non ci avevo pensato. PEro' in liena di massima (diciamo nel 90% dei 
casi) se fai un 
INSERT INTO ... SELECT ...
con una grossa mole di dati le id inserite non ti servono (subito).
Risolvi definendo il campo con default collegato alla sequenza:
id int4 DEFAULT nextval(layout_id_layout_seq) 
FRANK
ps: bel 3ad, costruttivo :)))
--
frank@office
Debian (Sid) GNU/Linux-2.4.18 on a PiV@1,6GHz-320MB 

semaforica di qualche tipo, il primo modo (sudicio) e' piu' veloce.
Ma non dovrebbe essere tanto sudico, perchè nelle FAQ di PG dicono:
4.15.3) Don't currval() and nextval() lead to a race condition with other
users?
No. Currval() returns the current value assigned by your backend, not by
all users.
http://www.ca.postgresql.org/docs/faq-english.html#4.15.3
Faser
-- 
FABIO SERRA
*Questo testo deve essere valutato secondo il senso della RFC-3*
Per rispondere in e-mail sostituire "invalid" con "faser"
http://www.cfmentor.com
--------------------

users?
Appunto. Ma questo che descrivi e' il SECONDO modo, non il primo :-)


Appunto. Ma questo che descrivi e' il SECONDO modo, non il primo :-)
Ops...scusa. Quello però che volevo dire è che non dovrebbe essere
necessario mettere la query all'interno di una transazione. Corretto?
Oppure devo sempre metterla in una transazione (BEGIN bla bla bla)
altrimenti non recupero l'id giusto?
Ciao.


necessario mettere la query all'interno di una transazione. Corretto?
Non lo so; ho fatto uora uora un po' di prove, con accessi concorrenti,
e parrebbe darti ragione: non appena utilizza nextval(), diventa subito
accessibile currval(), e non ci sono conflitti.
Mi ricordo che con PostgreSQL 6.5 avevo avuto noie, ma questo e' il 7.2
e funziona. O forse sbagliai allora, chi sa.


accessibile currval(), e non ci sono conflitti.
Da quello che ho capito dalla documentazione non ci dovrebbero essere
problemi. Non ho trovato però nessuna spiegazione su come la cosa sia
gestita internamente. 
Ciao e grazie.


 ha scritto nel messaggio
news:6mkcgu034u4rvtn3s...@4ax.com...
