2013-02-15 20 views
40

Quindi so in MySQL è possibile inserire più righe in una query in questo modo:MySQL eliminare più righe in condizioni di una query uniche per ogni riga

INSERT INTO table (col1,col2) VALUES (1,2),(3,4),(5,6) 

Vorrei eliminare più righe in modo simile . So che è possibile eliminare più righe in base alle stesse identiche condizioni per ogni riga, cioè

DELETE FROM table WHERE col1='4' and col2='5' 

o

DELETE FROM table WHERE col1 IN (1,2,3,4,5) 

Tuttavia, quello che se volevo eliminare più righe in una query, con ogni fila avendo un insieme di condizioni uniche per se stesso? Qualcosa di simile sarebbe quello che sto cercando:

DELETE FROM table WHERE (col1,col2) IN (1,2),(3,4),(5,6) 

Qualcuno sa di un modo per fare questo? O non è possibile?

risposta

75

Eri molto vicino, è possibile utilizzare questo:

DELETE FROM table WHERE (col1,col2) IN ((1,2),(3,4),(5,6)) 

consulta questo fiddle.

+1

@amitkate, perché no? – Pacerier

+4

Si noti che in MySQL 5.6 questo si comporta male come i confronti della tupla finiscono per fare una scansione della tabella. Si dovrebbe preferire "WHERE (col1 = 1 AND col2 = 2) OR (col1 = 3 AND col2 = 4) ..." per prestazioni migliori. Questo è stato risolto in 5.7. – ep4169

+0

Se qualcuno è curioso, questo è il bug corretto in 5.7.3 che i riferimenti @ ep4169: https://bugs.mysql.com/bug.php?id=31188 – Kip

8

Una leggera estensione alla risposta data, quindi, si spera utile per il richiedente e chiunque altro guardando.

È inoltre possibile SELECT i valori che si desidera eliminare. Ma fai attenzione all'errore 1093 - Non puoi specificare la tabella di destinazione per l'aggiornamento nella clausola FROM.

DELETE FROM 
    orders_products_history 
WHERE 
    (branchID, action) IN (
    SELECT 
     branchID, 
     action 
    FROM 
     (
     SELECT 
      branchID, 
      action 
     FROM 
      orders_products_history 
     GROUP BY 
      branchID, 
      action 
     HAVING 
      COUNT(*) > 10000 
     ) a 
    ); 

ho voluto eliminare tutti i record della storia in cui il numero di record di storia per una singola azione/ramo superare i 10.000. E grazie a questa domanda e alla risposta scelta, posso.

Spero che questo sia utile.

Richard.

+1

͏ + 1, ma il modo in cui formatti il ​​tuo SQL è .............. – Pacerier

+0

La formattazione serve a fornire gerarchia e dipendenza. Certo, una riga di SQL sarebbe la stessa ma illeggibile. Praticamente tutto è meglio di un 1 liner. Certo, io uso Whitesmith per il mio codice e a nessuno piace neanche questo. "Troppo spazio bianco" li sento lamentarsi. Pah! Dico. Usa un IDE che lo formatta per la tua preferenza per la modifica e per le preferenze del repository quando salvi. Oh ... tu usi VI ... ! :-) –

+0

Cosa intendi con "Whitesmith"? – Pacerier