Sostituisci nella syntax della query

Voglio essere in grado di aggiornare una tabella dello stesso schema usando un’istruzione “replace into”. Alla fine, devo essere in grado di aggiornare una grande tabella con valori che potrebbero essere cambiati.

Ecco la query che sto usando per iniziare:

REPLACE INTO table_name (visual, inspection_status, inspector_name, gelpak_name, gelpak_location), VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01'); 

Quello che non capisco è come fa il motore di database a sapere cosa è una riga duplicata e cosa no? Questi dati sono estremamente importanti e non posso rischiare di corrompere i dati. È semplice come “se tutte le colonne elencate hanno lo stesso valore, è una riga duplicata”?

Sto solo cercando di capire un modo efficace per farlo, così posso aggiornare> 45.000 file in meno di un minuto.

Come dice la documentazione :

REPLACE funziona esattamente come INSERT, eccetto che se una vecchia riga nella tabella ha lo stesso valore di una nuova riga per una PRIMARY KEY o un indice UNIQUE, la vecchia riga viene cancellata prima che la nuova riga venga inserita.

REPLACE funziona in modo molto simile a un INSERT che sovrascrive solo i record che hanno lo stesso indice PRIMARY KEY o UNIQUE , tuttavia, attenzione.

Shlomi Noach scrive del problema con l’utilizzo di REPLACE INTO qui :

Ma le persone deboli come me dovrebbero essere consapevoli di quanto segue: è una soluzione pesante. Potrebbe essere proprio quello che stavi cercando in termini di facilità d’uso, ma il fatto è che su chiavi duplicate, vengono eseguiti DELETE e INSERT, e ciò richiede un esame più attento.

Ogni volta che una riga viene eliminata, tutti gli indici devono essere aggiornati e, soprattutto, la CHIAVE PRIMARIA. Quando viene inserita una nuova riga, succede lo stesso. Soprattutto sulle tabelle InnoDB (a causa della loro natura cluster), questo significa molto overhead. La ristrutturazione di un indice è un’operazione costosa. Potrebbe essere necessario unire i nodes indice su DELETE. Potrebbe essere necessario dividere i nodes a causa di INSERT. Dopo molte esecuzioni di REPLACE INTO, è molto probabile che il tuo indice sia più frammentato di quanto sarebbe stato, se avessi usato SELECT / UPDATE o INSERT INTO … ON DUPLICATE KEY

Inoltre, c’è la nozione di “bene, se la riga non c’è, la creiamo, se è lì, semplicemente viene aggiornata”. Questo è falso. La riga non viene semplicemente aggiornata, ma completamente rimossa. Il problema è che se c’è una PRIMARY KEY su quella tabella e REPLACE INTO non specifica un valore per la PRIMARY KEY (ad esempio, è una colonna AUTO_INCREMENT), la nuova riga ottiene un valore diverso, e questo potrebbe non essere quello che stavi cercando in termini di comportamento.

Molti usi di REPLACE INTO non hanno alcuna intenzione di modificare i valori PRIMARY KEY (o altri UNIQUE KEY). In tal caso, è meglio lasciarli soli. In un sistema di produzione che ho visto, la modifica di REPLACE INTO in INSERT INTO … ON DPLICATE KEY ha comportato un throughput dieci volte maggiore (misurato in query al secondo) e un drastico calo nelle operazioni IO e nella media del carico.

In sintesi, REPLACE INTO potrebbe essere giusto per la tua implementazione, ma potresti trovare più appropriato (e meno rischioso) utilizzare INSERT ... ON DUPLICATE KEY UPDATE .