Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497

    last insert id , e inserimenti multipli

    Resto perplesse del perche' se faccio una query con inserimenti multipli e poi chiamo la funzione LAST_INSERT_ID() mi viene restituito il primo e non l'ultimo id inserito ....

    Pigliato dal furore piu' brutale in quanto nn risucivo ad aver egli id corretti ho fatto una prova che mi di fatto mi ha congelato :

    1 - creo tabella
    Codice PHP:

    CREATE TABLE 
    IF NOT EXISTS testami (
      
    id int(11NOT NULL AUTO_INCREMENT,
      
    campo1 varchar(255) DEFAULT NULL,
      
    PRIMARY KEY (id)

    2 - eseguo un inserimento con successiva query di controllo sull'ultimo id inserito
    Codice PHP:

    insert into testami 
    (campo1)
    values"v1" ) , ( "v2" ) , ( "v3" ) , ( "v4" ) ;
    SELECT LAST_INSERT_ID(); 
    mi aspetto di ottenere l'id 4 .....invece mi da :
    Codice PHP:
    LAST_INSERT_ID()

    ma come qshdjsodahdoiahjr2p30i'čqw+p+*é*****+
    e' possibile sta cosa ?


  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Ciao, per ottenere ultimo id inserito dovresti per primo eseguire la query es.

    Codice PHP:
    $sql "insert into(sNome, sCognome) values ('Mario','Rossi')";
    $result mysql_query($sql$oConn);
    $ultimo_id mysql_insert_id();
    echo 
    $ultimo_id
    Spero di esserti stato d'aiuto!

  3. #3
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Il problema e' che la mysql_insert_id() in php ha un enorme problema di formato dati, se l'id della tabella e' tipo big int e il valore dell'id va in overflow avro un intero sballato rispetto al reale numero che dovrebbe essere, per cui l'utilizzo di quella funzione a me nn va bene perche' non posso sapere a priori se l'id sara' un int o un big int.

    inoltre il mio problema riguardava direttamente l'sql e non la parte in php.

    Cmq ho scoperto che quel funzionamento e' dettato da specifica di mysql che negli inserimenti multipli restituisce sempre il primo id inserito invece dell'ultimo per motivazioni alquanto oscure e non si puo' nemmeno usare un flag come parametro per decidere che id farsi restituire.

    Ora utilizzero' un approccio differente per poter anche mantenere la coerenza dei dati in caso di query "simultanee"

    faro cosi'

    1 - lock table
    2 - esegui query
    2.1 - errore => forgia risultato
    2.2 - successo => recupera id tramite select max .... => forgia risultato
    3 - unlock table
    4 - termina funzione

    ... che pallottole .

  4. #4
    E comunque anche con mysql_insert_id() di php si ottiene il primo degli id inseriti.
    Ciao!

  5. #5
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Beh alla fine ho risolto in altro modo ,
    solo mi ero dimenticato di postare e cmq e' proprio cosi' che funziona.

    A sto punto la mia soluzione e' stata :

    1- conto quanti elementi vado ad inserire
    2- eseguo la query
    3- mi faccio dare il primo id inserito
    4- sommo il numero di elementi che ho inserito .

    I problemi pero' vanno a generarsi o ho incrementi differenti dal +1 ( ma cmq risolvibili con i+(num elems * incremento) ) oppure chiavi differenti.

    Cmq queste soluzioni con chiavi intere funzionano bene.

    Ciauz.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    ti dō qualche suggerimento, anche se bisogna dire che in questo forum c'č chi la vede in modo diametralmente opposto.
    fai te, anche sulla base della micro-esperienza che ti stai facendo

    non usare mai e poi mai campi autoincrementanti come "finte chiavi". Usali come cursori

    lascia perdere il lock delle tabelle intere, avrai prestazioni a dir poco basse con race ad ogni passo (e perfino rischio starvation)

    soprattutto: lascia stare l'ultimo ser inserito. cambia proprio la logica.
    tra l'altro in un ambiente con transazioni č devastante a dir poco.
    inoltre NON riusciresti a portare il programma su un altro db
    ---
    Usa una "vera" chiave, la quale non ti richiede minimamente nč di lockare il db, nč di chiedere il campo autoincrementante, nč di fare "strani" calcoli (che possono facilmente portare a violazioni di unicitā), nč ad aver problemi con backup e restore, e rendere la portabilitā su altri motori decisamente pių facile.

  7. #7
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    La sol "lock table" l'ho droppata gia' da tanto tempo .

    Per le chiavi le ho settate in primary key tutte e per comodita' sono tutte auto_increment.

    Per il recupero del codice dell'ultima riga inserita fronte di un inserimento multiplo ho implementato la soluzione "mi faccio i conti" e non ho mai avuto problemi.

    Per quanto riguarda la portabilita' non interessa all'azienda per cui alla fine si sviluppa senza considerare portabilita' sono applicazioni che funzionano su php e mysql( non c'e' tempo non c'e' tempo !!! )

    Ciauz.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Virus_101
    Per il recupero del codice dell'ultima riga inserita fronte di un inserimento multiplo ho implementato la soluzione "mi faccio i conti" e non ho mai avuto problemi.
    si vede che hai carichi veramente minimi

  9. #9
    Scusate...ma se tu devi recuperare l'ultimo id inserito e questo id č una chiave primaria autoincrement e il db č mysql...
    codice:
    select 'AUTO_INCREMENT'
    from TABLES
    where TABLE_NAME = '{$tablename}'
    AND TABLE_SCHEMA = '{$database}'
    da fare sul db information_schema, no?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    no

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.