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?

È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top