Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747

    [MySQL] UPDATE su due tabelle

    Ho due tabelle, una con dei viaggi con relativo 'id' per ognuno

    ed un'altra tabella di indirizzi email di utenti che hanno partecipato ai viaggi, quindi
    con un campo che associa ogni indirizzo email al relativo viaggio

    ho visto che può capitare di dover cambiare l'id di qualche viaggio e sto cercando
    di modificare con un'unica query anche gli id dei viaggi nella tabella degli indirizzi email

    purtroppo quando eseguo la query nella tabella degli indirizzi email viene modificato solo il primo record

    la query che ho partorito è questa
    Codice PHP:
    UPDATE viaggi INNER JOIN indirizzi_email

    ON     viaggi
    .id_viaggio indirizzi_email.id_viaggio

    SET    viaggi
    .id_viaggio '".$_id_viaggio_modificato."'indirizzi_email.id_viaggio '".$_id_viaggio_modificato."'

    WHERE  viaggi.id_viaggio '".$_id_viaggio."'

    AND    indirizzi_email.id_viaggio '".$_id_viaggio."' 
    Cosa potrebbe essere che non va?
    Errare humanum est, perseverare ovest

  2. #2
    Cioa,

    credo che possa essere dovuto al fatto che subito dopo che ha aggiornato la prima riga, id_viaggio è ormai cambiato e quindi non trova righe successive che soddisfano la condizione del where

    sinceremante al volo non saprei risolvere (anhce se un modo ci deve essere)...


    ...però visto che usi php, non sarebbe da scartare l'idea di fare due update successive
    prima una sulla tabella viaggi e poi un'altra sulla tabella mail, tanto:
    1. $_id_viaggio_modificato e $_id_viaggio ce l'hai in memoria
    2. se è un'operazione che fai solo ogni tanto e non in maniera massiva, la differenza di performance è trascurabile

  3. #3
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Grazie,

    si, è un operazione che capita raramente di fare in quanto funzionarà unicamente su un database in locale

    ma desideravo proprio capire come fare l'update con un'unica query.
    Errare humanum est, perseverare ovest

  4. #4
    Originariamente inviato da carlo2002

    ma desideravo proprio capire come fare l'update con un'unica query.
    Pensandoci un po' devo dire che secondo me il caso concreto da te descritto è irrisolvibile proprio per una questione di cross-referece tra le due tabelle... in pratica il primo update vanifica i successivi....

    Dal punto di vista del DB questa è una situazione che va risolta classicamente con un trigger ON UPDATE sulla tabella 'viaggi'

    tu cambi l'id a viaggi e il trigger si occupa di propagare il cambiamento alle altre tabelle interessate...pulito e da manuale

  5. #5
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Originariamente inviato da philbert
    Pensandoci un po' devo dire che secondo me il caso concreto da te descritto è irrisolvibile proprio per una questione di cross-referece tra le due tabelle... in pratica il primo update vanifica i successivi....
    ok, capito

    Dal punto di vista del DB questa è una situazione che va risolta classicamente con un trigger ON UPDATE sulla tabella 'viaggi' tu cambi l'id a viaggi e il trigger si occupa di propagare il cambiamento alle altre tabelle interessate...pulito e da manuale
    interessante, non ho mai fato una cosa del genere

    sto guardando come fare questi trigger, a parte che si trova sempre la stessa spiegazione con lo stesso codice di esempio

    ma una cosa proprio non trovo e non capisco, dove si mette il codice per creare un trigger?
    se uso phpmyadmin, forse nel form per l'inserimento dell'sql?

    una volta inserito se faccio l'esportazione del db mi viene salvato anche il trigger?
    Errare humanum est, perseverare ovest

  6. #6
    mi pare che la struttura della query non sia correttissima.

    codice:
    Multiple-table syntax:
    
    UPDATE [LOW_PRIORITY] [IGNORE] table_references
        SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
        [WHERE where_condition]
    la interpreterei cosi':

    codice:
    UPDATE viaggi, indirizzi_email
    SET viaggi.id_viaggio = '".$_id_viaggio_modificato."',
        indirizzi_email.id_viaggio = '".$_id_viaggio_modificato."'
    WHERE viaggi.id_viaggio = indirizzi_email.id_viaggio
        and viaggi.id_viaggio = '".$_id_viaggio."'
    Ovviamente prova prima con una select equivalente per vedere quali record raccogli e che saranno poi modificati dall'update.

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

  7. #7
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Originariamente inviato da piero.mac
    mi pare che la struttura della query non sia correttissima.
    la interpreterei cosi':
    codice:
    UPDATE viaggi, indirizzi_email
    SET viaggi.id_viaggio = '".$_id_viaggio_modificato."',
        indirizzi_email.id_viaggio = '".$_id_viaggio_modificato."'
    WHERE viaggi.id_viaggio = indirizzi_email.id_viaggio
        and viaggi.id_viaggio = '".$_id_viaggio."'
    neanche così, cambia sempre e solo il primo record di quelli associati

    perchè se è
    codice:
    WHERE  viaggi.id_viaggio = indirizzi_email.id_viaggio
    come cambia l'id del viaggio poi non c'è più il riferimento corretto
    Errare humanum est, perseverare ovest

  8. #8
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    codice:
    UPDATE viaggi, indirizzi_email
    SET viaggi.id_viaggio = '".$_id_viaggio_modificato."',
        indirizzi_email.id_viaggio = '".$_id_viaggio_modificato."'
    WHERE viaggi.id_viaggio ='".$_id_viaggio."'
    AND indirizzi_email.id_viaggio = '".$_id_viaggio."'
    ecco, così cambia l'id dei viaggi anche negli indirizzi email
    però in questo modo se non ho indirizzi email associati al viaggio
    la modifica non viene fatta a quest'ultimo



    mi sa che il doppio update diventa sempre più obbligatorio
    Errare humanum est, perseverare ovest

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