Chiedo il vostro aiuto per superare un ostacolo su cui sto sbattendo da giorni!
Sto sviluppando un'applicazione gestionale che gira in locale e che memorizza dati in un db anch'esso locale.
Ogni settimana devo copiare tali dati su un db remoto, identico a quello locale (stelle tabelle ecc) così da avere un backup on-line.
Ho risolto i problemi di accesso al db remoto tramite proxy.
Ciò che mi fa "sudare" sono le query di inserimento dati!
Vi riporto le specifiche.
Possono verificarsi questi casi:
- Il db Locale è vuoto e quello Locale contiene dati (ad esempio se formatto il pc).
- Il db Remoto è vuoto e quello Locale contiene dati (non ho mai fatto un backup on-line).
- Entrambi contengono dati; quello Locale contiene dati più aggiornati che devo copiare on-line (funzionamento normale).
- Entrambi contengono dati; quello Remoto è più aggiornato (ad esempio nel caso in cui dopo aver copiato on-line i dati, ho formattato il pc e reinserito nel db locale dei dati tramite un file di backup obsoleto).
Ora...
- Quando copio da Locale a Remoto devo usare una sola query di inserimento multiplo (per via del sistema di intefracciamento al db remoto), quindi del tipo "INSERT INTO movimenti (operazione, ora, operatore) VALUES (...,...), (...,...), ecc". Passo cioè più valori nella query così da svolgere la scrittura dati tramite una sola query.
- Per la copia da Remoto a Locale non ci sono problemi, estraggo i dati e posso agire tramite while ( $row = mysql...... ) { .... }
- La tabella contiene id (primary key), operazione, ora, operatore. Non ci sono campi UNIQUE.
- Non devo duplicare record già inseriti.
Concettualmente non è complicato, ma gli ID in locale e in remoto non corrispondono (il db remoto è utilizzato come backup da diversi operatori) quindi INSERT IGNORE non è la soluzione dato che l'unico campo primario è ID.
In pratica quando scrivo un dato nel db remoto devo verificare se esiste già e devo inviarne parecchi in un'unica query. Come si fa?!
Esiste un modo per combinare
codice:
INSERT INTO movimenti (operazione, ora, operatore) SELECT 'operazione1','ora1','operatore1' FROM DUAL WHERE NOT EXISTS (SELECT * FROM movimenti WHERE operazione='operazione1' AND ora='ora1' AND operatore='operatore1');
Con
codice:
INSERT INTO movimenti (operazione, ora, operatore) VALUES (''operazione1', 'ora1', 'operatore1'), ('operazione2', 'ora2', 'operatore2'),....
?
Grazie in anticipo