2014-11-10 20 views
7

Ho bisogno di aggiornare una tabella tranne i primi 1000 record. La mia domanda è come questo:Aggiornamento MySQL dopo N righe

UPDATE tableA 
SET price = 100 
WHERE price = 200 AND 
     item_id =12 AND 
     status NOT IN (1,2,3); 

So che l'approcah subquery funzionerà qui, ma sto avendo un enorme tavolo in cui 200000 record soddisfano la condizione WHERE ed è in crescita. Quindi penso che se seguirò l'approccio della sub query, non si ridimensionerà con la crescita del DB.

Inoltre ho visto specificare LIMIT nella query UPDATE ma è fino a un certo limite. Nel mio caso è dopo un certo offset e dovrebbe aggiornare tutti i record.

Inoltre è possibile trovare il conteggio totale e specificarlo con LIMIT. Ma la query COUNT() non funziona.

risposta

0

Non sono sicuro che questa sia la soluzione giusta, ma se nella tabella è presente una colonna ID univoca; diciamo, per esempio, ID, quindi puoi facilmente pronunciare il predicato dicendo WHERE ID > 1000. Che prenderà in considerazione solo le righe dalla posizione 1001th come

UPDATE tableA SET price = 100 
WHERE price = 200 
AND item_id = 12 
AND ID > 1000 
+0

Grazie a Rahul per la rapida risposta. ma non posso fare affidamento sull'ID qui perché sta selezionando per un articolo specifico e quindi gli ID potrebbero non essere in un ordine. –

+1

con 'ID' Voglio dire, una colonna unica autoincremento come. quindi la soluzione di cui sopra è la più efficiente. altrimenti è un po 'noioso quando arriva a un carico enorme. – Rahul

+0

Sì. Intendevo anche lo stesso :) –

1

È possibile utilizzare variabile definita dall'utente:

SET @X = (SELECT ID FROM tableA 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    ORDER BY ID LIMIT 1000,1); 
UPDATE tableA SET price = 100 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    AND ID>@X; 

Sì, avrete bisogno di un modo come definire "che cosa è prime file N". Le variabili definite dall'utente ti offrono solo più opzioni su come farlo. E se non è possibile farlo efficacemente in alcune query di selezione, sarà necessario riflettere in qualche modo su come rielaborare tale tabella. Forse un approccio di indicizzazione diverso, dividendo la tabella, memorizzando nella cache alcuni valori, ecc.