Possibile avere un / Aggiunta scrittura lotti sovrascrittura misto in MySQL?
-
08-10-2019 - |
Domanda
Sto installando un uploader (usando PHP) per il mio cliente in cui possono selezionare un file CSV (in un formato predeterminato) sulla loro macchina per caricare. Il CSV avrà probabilmente 4000-5000 righe. Php elabora il file leggendo ogni riga del CSV e inserendolo direttamente nella tabella DB. Quella parte è facile.
Tuttavia, idealmente prima di aggiungere questi dati alla tabella di database, mi piacerebbe rivedere 3 delle colonne (A, B, e C) e controllare per vedere se ho già una combinazione di corrispondenza di quei 3 campi nel tavolo ED EVENTUALMENTE avrei preferito aggiornamento che fila piuttosto che aggiungendo. Se non ho un combo corrispondenza di quei 3 colonne voglio andare avanti e inserire la riga, aggiungendo i dati alla tabella.
Il mio primo pensiero è che ho potuto rendere le colonne A, B, e C un indice univoco nel mio tavolo e poi basta inserire ogni riga, rilevare un 'fallito' INSERT (a causa della restrizione del mio indice univoco) in qualche modo e poi effettuare l'aggiornamento. Sembra che questo metodo potrebbe essere più efficiente di dover fare una SELECT separato per ogni riga solo per vedere se ho una combo di corrispondenza già in mio tavolo.
Un terzo approccio può essere quello di TUTTO semplicemente aggiungere, senza usare MySQL indice univoco e poi prendete solo l'ultima combinazione unica quando il client interroga poi quel tavolo. Comunque sto cercando di evitare di avere una tonnellata di dati inutili in tale tabella.
I pensieri sulle migliori pratiche o approcci intelligenti?
Soluzione
Se si fanno le 3 colonne l'ID univoco, si può fare un inserto con ON DUPLICATE KEY.
INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7)
ON DUPLICATE KEY UPDATE d=5,e=6,f=7;
Si può leggere di più su questa tecnica a portata di mano qui nel MySQL manuale .
Altri suggerimenti
Se si aggiunge un indice univoco sulle (B, C, A) colonne, quindi è possibile utilizzare REPLACE per fare questo in una dichiarazione:
REPLACE funziona esattamente come INSERT, tranne che se una vecchia riga nella tabella ha lo stesso valore di una nuova riga per un PRIMARY KEY o un indice univoco, il vecchio riga viene eliminata prima che la nuova riga è Inserito ...