Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [MySQL] Avere tutti gli ID di una INSERT multipla

    Ciao,
    dato un set di righe da inserire in una tabella con un'unica query:

    codice:
    INSERT IGNORE INTO books
    (id, title, isbn)
    VALUES
         (12, 'I Buddenbrook', '9873241'),
         (4, 'Hamlet', '31241298713'),
         (9, 'Milk and mint', '10929201019')
    ON DUPLICATE KEY UPDATE
    come posso rilevare l'array di tutte le chiavi primarie degli elementi inseriti/aggiornati?
    Ne ho bisogno per inserirli in una tabella relazionale e vorrei evitare una SELECT ulteriore che rallenti il processo.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    intanto il mysql ti puo' restituire l'ultimo id se e' stato lui a generarlo (su colonne autoincrement).

    Nella tua query invece vedo che gli id li specifichi tu - quindi li conosci apriori.

    Comunque, nel caso servissero gli id di una insert multipla su una autoincrement, e' semplice. Basta prendere l'ultimo. Tutti gli altri saranno ultimo-1, ultimo-2, etc.

  3. #3
    Originariamente inviato da bubi1
    intanto il mysql ti puo' restituire l'ultimo id se e' stato lui a generarlo (su colonne autoincrement).

    Nella tua query invece vedo che gli id li specifichi tu - quindi li conosci apriori.

    Comunque, nel caso servissero gli id di una insert multipla su una autoincrement, e' semplice. Basta prendere l'ultimo. Tutti gli altri saranno ultimo-1, ultimo-2, etc.
    Sì hai ragione ho scritto una cavolata perché la query è inventata al volo e non calza l'esempio.

    Nel caso reale non conosco gli ID.
    Supponendo che inserisco solo il title dell'esempio, e che alcuni title esistono già, con INSERT IGNORE e la clausola ON DUPLICATE KEY UPDATE un title già esistente genererebbe un UPDATE della tupla, mentre se non esistesse già si avrebbe l'INSERT.

    Il mio problema è ottenere gli ID di tutte le nuove righe passate alla INSERT, a prescindere che siano UPDATE o INSERT.

    Ho scartabellato pagine e pagine di ricerca ma mi sembra che non ci sia la soluzione a questo problema, se non una SELECT con where clause chilometrica (where title = blabla OR title = bla OR title = etc...).
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Anche io penso sia impossibile fare questo con una insert multipla. Ma non credo che la soluzione migliore sia la select kilometrica. Io rinuncerei alle insert multiple, le farei una per una e guarderei il risultato per sapere se si e' trattato si una insert o update Sempre meglio di una ricerca aggiuntiva..

  5. #5
    Originariamente inviato da bubi1
    Anche io penso sia impossibile fare questo con una insert multipla. Ma non credo che la soluzione migliore sia la select kilometrica. Io rinuncerei alle insert multiple, le farei una per una e guarderei il risultato per sapere se si e' trattato si una insert o update Sempre meglio di una ricerca aggiuntiva..
    Nel caso in cui usassi più query INSERT singole per ogni tupla abbasso le prestazioni dell'applicazione, non credo che ci siano guadagni rispetto ad una INSERT multipla.

    Inoltre il problema è che potrei avere l'ID solo per le tuple inserite, non per gli UPDATE, per i quali dovrei lanciare comunque una SELECT dedicata.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    nein.

    insert into tabella (campo_unico) values ($valore_dup) on duplicate key update id=LAST_INSERT_ID(id), campo_counter=campo_counter+1
    (l'id e' autoincrement primary, campo_unico e' unique, e campo_counter e' un esempio di qualsiasi cosa vogliamo fare on update)

    da una query cosi, tu avrai il last_insert_id che sara id+1 nel caso di update o l'id nuovo effettivo nel caso di insert.
    Se e' un insert o update lo vedi da affected rows.

    per quanto riguarda l'abbassamento delle prestazioni, cioe un abbassamento preoccupante, permettimi di avere i miei dubbi, finche non pubblicherai i risultati di un benchmark reale

  7. #7

    ON DUPLICATE KEY UPDATE su tabella di relazioni

    Ciao bubi1,
    l'insert con clausola on duplicate key update su cui mi hai dato dei suggerimenti va bene nel caso di tabella con relazione uno a uno o uno a molti (perché mi basta una sola chiave primaria o un solo indice per attivare la clausola ON DUPLICATE KEY), ma nel caso di una tabella di relazioni non trovo un'ottimizzazione simile.

    Esempio: tabella di relazioni tra la tabella pagine e moduli:

    id (primary key), page_id (key), module_id

    Il problema è che un record è unico in quanto a combinazione dei due valori di page_id e module_id e non conosco un metodo per rilevare questo status e attivare un UPDATE.

    Praticamente, dovendo aggiornare i moduli di una pagina dovrei ignorare i record che hanno questi due valori uguali ai record già presenti in tabella, ed inserire invece quelli che hanno una combinazione dei due non ancora presente.

    Puoi suggerire un metodo migliore della cancellazione dei record aventi un dato indice e il reinserimento?
    Anche perché con questo sistema, ad ogni modifica l'autoincrement fa il suo lavoro...
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  8. #8
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Beh, puoi impostare un indice unique anche su due campi, "on duplicate key" dovrebbe funzionare lo stesso.

  9. #9
    Originariamente inviato da bubi1
    Beh, puoi impostare un indice unique anche su due campi, "on duplicate key" dovrebbe funzionare lo stesso.
    Bubi1 ma sei un grande
    Non sapevo che si potesse definire un indice su più colonne...

    Grazie
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

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.