2013-02-15 22 views
40

Więc wiem w MySQL to możliwe, aby wstawić wiele wierszy w jednej kwerendzie tak:MySQL usunąć wiele wierszy w warunkach jednego zapytania unikalne dla każdego wiersza

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

Chciałbym usunąć wiele wierszy w podobny sposób . Wiem, że to możliwe, aby usunąć wiele wierszy w oparciu o te same warunki dla każdego wiersza, tj

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

lub

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

Jednak co, jeśli chciałem usunąć wiele wierszy w jednym zapytaniu, a każda wiersz mający zestaw wyjątkowych dla siebie warunków? Coś takiego byłoby to, czego szukam:

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

Czy ktoś wie o sposobie, aby to zrobić? Czy to nie jest możliwe?

Odpowiedz

75

Byliście bardzo blisko, można użyć to:

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

Proszę zobaczyć ten fiddle.

+1

@amitkate, czemu nie? – Pacerier

+4

Należy pamiętać, że w MySQL 5.6 będzie to działało słabo, ponieważ porównanie krotek kończy się skanowaniem tabeli. Powinieneś preferować "WHERE (col1 = 1 AND col2 = 2) OR (col1 = 3 AND col2 = 4) ..." dla lepszej wydajności. Naprawiono to w 5.7. – ep4169

+0

Jeśli ktoś jest ciekawy, jest to błąd, który został naprawiony w 5.7.3, że odniesienia @ ep4169: https://bugs.mysql.com/bug.php?id=31188 – Kip

8

Niewielkie rozszerzenie udzielonej odpowiedzi, więc, miejmy nadzieję, przydatne dla pytającego i każdego, kto szuka.

Możesz także SELECT wartości, które chcesz usunąć. Ale uważaj na błąd 1093 - Nie możesz określić tabeli docelowej dla aktualizacji w klauzuli 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 
    ); 

chciałem usunąć wszystkie rekordy historii, gdzie liczba rekordów historii dla pojedynczego działania/oddziału przekracza 10,000. I dzięki temu pytaniu i wybranej odpowiedzi, mogę.

Mam nadzieję, że jest to przydatne.

Richard.

+1

͏ + 1, ale sposób formatowania SQL to .............. – Pacerier

+0

Formatowanie polega na zapewnieniu hierarchii i zależności. Oczywiście 1 linia SQL byłaby taka sama, ale nieczytelna. Prawie wszystko jest lepsze niż 1 liniowiec. Oczywiście używam Whitesmith dla mojego kodu i nikt też tego nie lubi. "Za dużo białej przestrzeni" Słyszę jak jęczą. Pah! Mówię. Użyj IDE, który formatuje go dla twoich preferencji do edycji i preferencji repo podczas zapisywania. Och ... używasz vi ... ! :-) –

+0

Co masz na myśli przez "Whitesmith"? – Pacerier