[MySQL] SQL UPDATE INNER JOIN

  • Creatore Discussione Creatore Discussione Rick
  • Data di inizio Data di inizio

Rick

Nuovo Utente
7 Feb 2017
4
0
1
Ciao a tutti,

ho un db con due semplici tabelle, composte dai seguenti campi:

Tabella a : ID, FLAG
Tabella b : ID, ID_A, FLAG

Chiaramente i campi ID sono autoincrement, i FLAG sono dei boolean, mentre ID_A è un intero. Il rapporto tra le due è di 1 record per A e 4 record per B, relazionati tra loro tramite il campo ID_A della tabella B legato al campi ID della tabella A.

Ho la necessità di aggiornare i campi FLAG delle due tabelle contemporaneamente, ed ho trovato due soluzioni, volevo sapere quale secondo voi è la migliore, o se ce ne sono altre più funzionali:

1) "UPDATE a INNER JOIN b ON b.ID_A = a.ID SET a.FLAG = FALSE, b.FLAG = FALSE WHERE a.ID = 1"
Faccio tutto con una query ma il valore a.FLAG viene scritto 4 volte inutilmente (o sbaglio?)

2) "UPDATE a SET a.FLAG = FALSE WHERE a.ID = 1"
"UPDATE b INNER JOIN a ON b.ID_A = a.ID SET b.FLAG = FALSE WHERE a.ID = 1"
Doppia query ma scrittura mirata nelle due tabelle

Cosa ne pensate ?

grazie

Riccardo
 
proverei così,
PHP:
UPDATE b, a SET a.flag=false, b.flag=false WHERE b.id_a=a.id AND a.id = 1234

oppure

UPDATE a SET flag=false WHERE id = 1234; UPDATE b SET flag=false WHERE id_a = 1234;
con l'attenzione che la colonna id_a nella tabella b sia indicizzata altrimenti hai operazioni sequenziali che comportano la lettura dell'intera tabella, in qualunque forma tu scriva le query
(qualche volta anche le join rendono la lettura sequenziale, dove posso le evito)

la seconda soluzione potrebbe comunque stare in un unico comando

(ps, non le ho provate, non avendo mysql, la prima soluzione non è garantita)
 
Ciao, interessante la prima, differenze funzionali rispetto all'uso di inner join?
 
la inner join consente l'aggiornamento degli elementi presenti contemporaneamente sia nella tabella a che nella b
lo stesso risultato dovrebbe darlo anche la query senza la inner join perché non è soddisfatta la condizione
b.id_a=a.id
uno dei due è null, evita però la join

ci sarebbe anche la soluzione di creare una view e poi aggiornare la "tabella" risultante, ma la tabella risultante deve contenere tutte le colonne da aggiornare

inutile parlare di tempi di esecuzione su aggiornamenti così "contenuti"
 
Infatti la mia è più una curiosità sulla filosofia da applicare, a livello di query sto su una al minuto, lentissimo penso per un motore SQL. Invece devo approfondire la questione dell'indicizzazione, ho varie tabelle con il campo che referenzia altri indici di tabelle, ho letto qualcosa al riguardo su un discorso di prestazioni migliori, anche se il mio db è abbastanza piccolo. Grazie mille per le risposte!
 

Discussioni simili