Pytanie Usuń instrukcję Mysql z limitem


Próbuję usunąć wiersze z tabeli, ale pojawia się błąd.

DELETE FROM `chat_messages` ORDER BY `timestamp` DESC LIMIT 20, 50;

Otrzymuję ten błąd na 50:

Wystąpił błąd w składni SQL; sprawdź w podręczniku, który odpowiada twojej wersji serwera MySQL, odpowiednią składnię do użycia w pobliżu "50" w wierszu 1

Nie mam pojęcia, co jest nie tak.


23
2017-08-22 00:25


pochodzenie


Zobacz także to pytanie na StackOverflow: stackoverflow.com/q/6111961/799653 - Drew


Odpowiedzi:


Nie można określić przesunięcia w DELETE„s LIMIT klauzula.

Tak więc jedynym sposobem, aby to zrobić, jest przepisanie zapytania na coś takiego:

DELETE FROM `chat_messages` WHERE id IN (select id from (select id
                                           FROM `chat_messages`
                                       ORDER BY `timestamp` DESC
                                          LIMIT 20, 50) x)

Załóżmy, że masz klucz podstawowy id kolumna

UPD: musisz wdrożyć podwójne zagnieżdżanie, aby oszukać mysql, ponieważ nie pozwala wybrać z aktualnie zmodyfikowanej tabeli (dzięki Martinowi Smithowi)


39
2017-08-22 00:28



MySQL na to nie pozwala (błąd 1093), chyba że dodasz dodatkowy poziom zagnieżdżenia. Widzieć stackoverflow.com/q/3271396/73226 - Martin Smith
+1 bicie mnie do odpowiedzi - DELETE akceptuje rowcount Tylko dla LIMIT. - Jason McCreary
Nie, ale zamierzam to zrobić: P. Dzięki - SBSTP
Zmodyfikowałem mój komentarz, aby dodać dalsze szczegóły. Jeśli podzapytanie jest bezpośrednio w IN pojawia się błąd "Nie można określić tabeli docelowej" komunikaty czatu "dla aktualizacji w klauzuli FROM". Możesz obejść to, wykonując podzapytanie pochodnej tabeli. - Martin Smith
@Martin Smith: o tak, świetna uwaga. Dziękuję Ci - zerkms