2010-06-09 18 views
14

Sto scrivendo un'applicazione e sto usando MySQL come DBMS, stiamo scaricando offerte di proprietà e ci sono stati alcuni problemi di prestazioni. La vecchia architettura assomigliava a questa: Una proprietà è aggiornata. Se il numero di righe interessate non è 1, l'aggiornamento non viene considerato corretto, quindi la query di aggiornamento risolve il problema. Se l'aggiornamento non ha avuto esito positivo e il numero di righe interessate è superiore a 1, abbiamo duplicati e li cancelliamo tutti. Dopo aver eliminato i duplicati, se necessario, se l'aggiornamento non ha avuto esito positivo, si verifica un inserimento. Questa architettura funzionava bene, ma c'erano alcuni problemi di velocità, perché le proprietà venivano eliminate se non venivano aggiornate per 15 giorni. In teoria il problema principale è l'eliminazione delle proprietà, perché alcune proprietà sono vive per mesi e gli indici sono molto distanti tra loro (stiamo parlando di oltre 500.000 proprietà).Sostituisce in avere una clausola where?

Il nostro ospite mi ha detto di usare sostituire in invece di eliminare proprietà e tutte le proprietà obsoleti devono essere considerati come morto. Ho fatto questo, ma i problemi hanno iniziato a verificarsi a causa di un errore di sintassi e non sono riuscito a trovare un esempio di sostituzione con una clausola where (vorrei sostituire una proprietà DEAD con la nuova proprietà invece di eliminare il vecchio proprietà e inserirne una nuova per assicurare l'ottimizzazione). La mia domanda si presentava così:

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue 

Naturalmente, ho calcolato idValue e gestito tutto, ma ho avuto un errore di sintassi. Vorrei sapere se ho torto e c'è una clausola where in cui sostituire.

Ho trovato una soluzione alternativa, che è anche meglio di sostituirla (usando semplicemente una query di aggiornamento) perché le eliminazioni avvengono dietro le tende se uso la sostituzione, ma vorrei sapere se ho torto quando dico che sostituire in non ha una clausola where. Per ulteriori di riferimento, si veda questo link:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Grazie per le vostre risposte in anticipo, Lajos Árpád

risposta

0

Nel tuo link di documentazione, essi mostrano tre forme alternative del comando replace. Anche se elided, l'unico che può accettare una clausola where è il terzo modulo con il trailing select.

replace sembra eccessivo rispetto a update se sto capendo correttamente il tuo compito.

+0

La ringrazio molto per la risposta. In effetti è un eccesso, hai assolutamente ragione, voglio solo sapere se inserire ha una clausola where per filtrare cosa sostituire, perché il nostro ospite ha detto che ha e vorrei chiarire la questione (Se ho già trovato fuori questo non vedo un motivo per non dirglielo) SOSTITUIRE [LOW_PRIORITY | DELAYED] [INTO] nome_tbl [(nome_col, ...)] SELEZIONA ... Se ho capito correttamente, la sintassi sopra è, dove dici che un dove potrebbe apparire. Hai ragione su questo, tuttavia, la clausola where è nella select –

+0

E la sostituzione in non ha un dove nell'esempio, quindi, penso che la sostituzione in non ha un dove. –

22

Vedo che avete risolto il problema, ma per rispondere alla tua domanda iniziale:

REPLACE INTO fa non una clausola WHERE.

La sintassi REPLACE INTO funziona esattamente come INSERT INTO tuttavia eventuali vecchie righe con la stessa chiave primaria o univoca viene eliminato automaticly prima di inserire la nuova riga.

Ciò significa che invece di una clausola WHERE, è necessario aggiungere la chiave primaria ai valori sostituiti per limitare l'aggiornamento.

REPLACE INTO myTable (
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 

... fornirà lo stesso risultato di ...

UPDATE myTable 
SET myColumn1 = 'value1', myColumn2 = 'value2' 
WHERE myPrimaryKey = 100; 

... o più esattamente:

DELETE FROM myTable WHERE myPrimaryKey = 100; 
INSERT INTO myTable(
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 
+1

Sì, l'ho fatto. Ho eseguito una query per trovare una riga "buona" e aggiornato quella riga, in questo modo ho avuto una soluzione, ma dopo averlo risolto, ero davvero curioso di sapere se ciò che mi è stato detto fosse vero e, sulla base di le risposte da qui e la mia ricerca (provare le cose), la sostituzione in manca di una clausola where, quindi, che sostituisce in è un delete + insert, quindi i miei indici non saranno ancora ottimizzati. Ho solo bisogno di un aggiornamento lì. Comunque, grazie per la tua risposta. –

+0

grazie Ivar. Più utile – khaverim