Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    35

    ID Ultimo record inserito.

    Ciao ragazzi,
    vi chiederò una cosa ai più esperti dovrebbe essere nota mentre ai meno forse sembrerà semplice ed invece non lo è affatto!

    Devo inerire un record e poi conoscerne l'ID (la chiave è un campo autogenerato in MySQL) per inserire un altro record in un altra tabella ed associalo al primo.
    Che funzione devo usare???

    Non rispondetemi cose del tipo "guarda l'ultimo ID" o "quello con il valore più alto" perchè in questo caso esistono problemi di concorrenza e non voglio bloccare l'accesso al database per compiere azioni atomiche forzate (che mi farebbero crollare le prestazioni).

    Vi ringrazio in anticipo.
    Fidarsi è bene... non fidarsi e meglio! Compro/Vendo solo ed escusivamente con consegna a mano!<br>
    Rifiutare la preinstallazione di Windows XP? Ora puoi

  2. #2
    mysql_insert_id()

    ti restituisce l' ultimo id inserito
    W la neve freska

  3. #3
    io direi che per risolvere dovresti ricorrere a quella funzione subito dopo aver fatto la query, usandola nello stesso script e magari nella riga immediatamente successiva alla chiamata al database, se puoi usando MYSQL_UNBUFFERED_QUERY al posto di MYSQL_QUERY così vai più veloce, tanto se ti serve l'ultimo ID, credo tu stia facendo una INSERT.
    "Una volta che si saranno esaurite senza successo tutte le possibilita', ci sara' una soluzione, semplice e ovvia, che saltera' immediatamente all'occhio di chiunque altro."

    Guardate: Il Miracolo delle Noci!!

  4. #4
    Certamente.... ti rende non l'ultimo id assoluto, ma l'ultimo id inserito da quella connessione.

    Di solito si utilizza per passare l'id inserito come referenza ad altra tabella. Esiste l'argomento link nella funzione che ti garantisce che ti venga reso esattamente quello che hai inserito tu.

    vedi il manuale...

    http://it2.php.net/manual/it/functio...-insert-id.php


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    SQL Server gestisce da solo problemi di contemporaneità
    credo anche MySql, le probabilità che due utenti generino la stessa query nello stesso istante comunque è pressochè infinitesima e cmq nn so se MySql abbia la possibilità di generare la stessa query contemporaneamente anche se pur nell'ordine dell'infinito ci sarà un piccolo sfasamento

  6. #6
    le query vengono tutte serializzate cioe' non vengono mai eseguite in parallelo ma una nelle chiappe all'altra. Se non metti il link (id resource#) potrebbe esserci le possibilita' infinitesimale che ti venga reso l'id generato dall'INSERT dell'ultima connessione aperta da quell'utente. Nel caso di php l'utento e' sicuramente sempre lo stesso per quello script e quindi potrebbe non essere il TUO id generato dalla tua insert.

    Quindi se eseguito immediatamente dopo e' sicuramente infinitesimale la possibilita' di errore, ma esiste l'id resource di connessione a disposizione che elimina anche l'infinitesimale possibilita' di errore. Quindi....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Originariamente inviato da smartEconomy
    ok!
    recepito!
    quindi al massimo l'unbuffered per rendere le cose leggere e amen!


    Grazie a tutti!
    per ricavare l'id l'unbuffered serve a nulla..... Non devi manco fare una query.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    35
    Possibilità infinitesima mica tanto..
    sono sufficienti 10utenti connessi assieme che inseriscano articoli in un carello per generare una buona probabilità!
    E sai... non è bello ritrovarsi un carello con della merce non ordinata o sbagliare destinatario!!!

    X maramao79: l'ultimo record non è necessariamente quello appena inserito in caso di concorrenza.

    X Lathspell: metterli vicino non serve a molto: non essendo operazioni atomiche non vengono fatte necessariamente una in sequenza all'altra, ma di mezzo possono essere eseguite altre operazioni di altri utenti.

    X piero.mac: credo che la tua risposta sia quella corretta! Ottimo.. per cui devo specificare il nome della connessione con cui ho fatto l'inserimento? GRAZIE!
    Bravo anche per le spiegazioni...
    Perchè sul link che mi hai mandato c'è un tizio che fa il lock?

    <?
    mysql_query("LOCK TABLES apc_forms WRITE");
    mysql_query("SET AUTOCOMMIT = 0");
    mysql_query("INSERT INTO apc_forms (form_title, form_event_id, form_expirey) VALUES ('title',1,'2005-10-10')");
    define('ID',mysql_query("SELECT LAST_INSERT_ID()"));
    mysql_query("COMMIT");
    mysql_query("UNLOCK TABLES");
    ?>

    X AndreaG85: Non mi risulta che i DBMS gestoscano la concorrenza! e lasciato al lato programmatore la gestione della cosa: magari ti offre gli strumenti per gestirla ma (credo di esserne piuttosto certo) non lo fa in automatico.
    Fidarsi è bene... non fidarsi e meglio! Compro/Vendo solo ed escusivamente con consegna a mano!<br>
    Rifiutare la preinstallazione di Windows XP? Ora puoi

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    35
    Ragazzi... guardate che questa è una cosa abbastanza importante.
    E se davvero utilizzate guardare semplicemente l'ultimo id (senza specificare la connessione) allora tutte le vostre applicazioni sono a rischio di errori!
    Fidarsi è bene... non fidarsi e meglio! Compro/Vendo solo ed escusivamente con consegna a mano!<br>
    Rifiutare la preinstallazione di Windows XP? Ora puoi

  10. #10
    Originariamente inviato da EvilBoy
    Perchè sul link che mi hai mandato c'è un tizio che fa il lock?
    codice:
    <?
    mysql_query("LOCK TABLES apc_forms WRITE");
    mysql_query("SET AUTOCOMMIT = 0");
    mysql_query("INSERT INTO apc_forms (form_title, form_event_id, form_expirey) 
                VALUES ('title',1,'2005-10-10')");
    define('ID',mysql_query("SELECT LAST_INSERT_ID()"));
    mysql_query("COMMIT");
    mysql_query("UNLOCK TABLES");
    ?>
    Quel tizio usa LAST_INSERT_ID() che e' una funzione di mysql SERVER che rende sempre l'ultimo id inserito. Da qualunque CLIENT esso sia stato eseguito, quindi serve il blocco della tabella.

    mysql_insert_id() e' una funzione del CLIENT mysql installato su php. Rileva esclusivamente l'id inserito dallo stesso CLIENT e se accompagnato dal resource id# della connessione esclusivamente da questa. Deve essere eseguito dopo un INSERT e assolutamente prima di qualsiasi altra query (il valore sarebbe zero o errato).

    Sarebbe (e') necessario assicurarsi di almeno una delle due cose(o anche entrambe):

    mysql_query("INSERT ... ) ha reso il valore 1. Se rendesse zero fermare con errore l'esecuzione dello script.

    mysql_insert_id($conn) ha reso un valore > 0. Se rendesse zero fermare con errore l'esecuzione dello script.





    ps.: quella query che hai segnalato e' pure senza controllo. Se l'INSERT dovesse fallire per qualsiasi ragione si andrebbe a leggere l'ultimo id inserito da chissa' chi.....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.