Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615

    [Postgre] Acquisire id della riga appena inserita

    Come da oggetto, subito dopo la query di insert vorrei catturare il valore id autoincrementale che il database ha assegnato alla riga appena inserita. Naturalmente la soluzione banale di eseguire subito dopo una query nella quale seleziono il massimo id presente è inaffidabile, in quanto non tiene conto della possibilità di una ulteriore operazione di insert eseguita nel tempo che intercorrerebbe tra le due operazioni da qualche altro utente. Grazie in anticipo.

  2. #2
    codice:
    currval('nometuatabella_id_seq')
    per dettagli guarda la documentazione relativa a currval ed alle sequenze.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Grazie ma... Sbaglio o il problema resta identico? Sia acquisendola tramite SELECT... MAX che con CURRVAL dovrei comunque eseguire una query DOPO aver eseguito l'aggiornamento, rischiando che nel tempo intercorrente tra le due operazioni qualcun'altro inserisca un'altra riga. O forse esiste una sintassi per inserire quel CURRVAL nello stesso blocco di codice relativo all'update?

    Grazie ancora.

  4. #4
    Nessun rischio. Come descritto in
    http://www.postgresql.org/docs/8.4/i...-sequence.html
    currval
    Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Notice that because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did.
    Considera che il tuo campo autoincrementale, altro non è che un campo il cui valore di default è:
    codice:
    default nextval('tuatabella_id_seq'::regclass)

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Grazie, molto gentile. Manca in quel documento una sintassi di questa istruzione; potresti indicarmi una riga di esempio per "acquisire" quel currval? Ho provato anche dall'editor delle query PG ma leggo che currval non è funzione definita. Sbaglio di certo io la sintassi. Grazie.

  6. #6
    Originariamente inviato da Shadow976
    Grazie, molto gentile. Manca in quel documento una sintassi di questa istruzione; potresti indicarmi una riga di esempio per "acquisire" quel currval?
    codice:
    create table test_table(
    	id serial primary key not null
    );
    insert into test_table default values;
    select currval ('test_table_id_seq'::regclass);
    testato e verificato con PostgreSQL 8.4.0.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    Attenzione al fatto che la "current session" è quella della connessione al DB (dico un'ovvietà). Quello che vorrei sottolineare è il fatto che se hai un applicazione on-line che aggiorna i dati, molto probabilmente tra una transazione e l'altra rilasci la connessione col DB e quindi la currval (se la fai in una successiva transazione on-line) potrebbe restituirti l'ultimo valore indipendentemente da chi l'ha inserito.
    No problem se non rilasci la connessione al DB.
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  8. #8
    Originariamente inviato da standard
    Attenzione al fatto che la "current session" è quella della connessione al DB (dico un'ovvietà). Quello che vorrei sottolineare è il fatto che se hai un applicazione on-line che aggiorna i dati, molto probabilmente tra una transazione e l'altra rilasci la connessione col DB e quindi la currval (se la fai in una successiva transazione on-line) potrebbe restituirti l'ultimo valore indipendentemente da chi l'ha inserito.
    No problem se non rilasci la connessione al DB.
    FALSO.
    Infatti (come ho già riportato precedentemente):
    http://www.postgresql.org/docs/8.4/i...-sequence.html
    currval
    ...
    (An error is reported if nextval has never been called for this sequence in this session.)
    ...
    ad esempio:
    codice:
    igtest=> select currval ('test_table_id_seq'::regclass);
    ERROR:  currval of sequence "test_table_id_seq" is not yet defined in this session

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    ah. ok.
    Per Postgre c'è questa particolarità, per cui, in quello scenario, occorrerebbe gestire quell'errore.

    Parlavo, in realtà, senza riferirmi ad un DB in particolare (anche perchè non conosco PostGre), ma in questo caso quello che dice MacApp (e la documentazione di riferimento) è verbo.
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    615
    Grazie infinite, purtroppo non va. Digitando nell'SQL editor

    select currval ('test_table_persons_id_seq'::regclass);

    vedo l'errore

    ERROR: currval of sequence "test_table_id_seq" is not yet defined in this session

    Ma quella sequenza nel mio db esiste! Ho controllato bene... Cosa sbaglio?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.