2011-07-03 21 views
8

W mysql mogę zapytać select * ... LIMIT 10, 30 gdzie 10 oznacza liczbę rekordów do pominięcia.Jak usunąć każdy rekord po n-tym wierszu w mysql?

Czy ktoś wie, w jaki sposób mogę zrobić to samo w instrukcjach usuwania, gdzie każdy rekord po usunięciu pierwszych 10 rekordów?

+0

Co jest kluczem do Twojego stół? –

+0

to ciąg GUID. – Roman

+0

Tę usuniętą odpowiedź należy wymienić Myślę: "USUŃ Z TABELI, GDZIE ID (WYBIERZ ID Z TABLE LIMIT 10, 30)". @Am skomentował, że to nie działa w "tej wersji MySQL". Więc chociaż nie jest to odpowiedź na pytanie, może być pomocna dla innych osób odbierających odpowiedź :) – Nanne

Odpowiedz

8

Biorąc pod uwagę brak rowId w MySQL (jak w Oracle), proponuję następujące:

alter table mytable add id int unique auto_increment not null; 

To automatycznie numeruje swoje wiersze w kolejności z select rachunku bez warunków lub order-by.

select * from mytable; 

Następnie po sprawdzeniu zamówienia jest zgodne z potrzebami (a może zrzut tabeli)

delete from mytable where id > 10; 

Wreszcie może chcesz usunąć tego pola

alter table mytable drop id; 
+0

Kilka pytań: Czy zdefiniowano sposób dodawania 'auto_increment' podczas zmiany takiej tabeli? Czy zachowałaby wymaganą kolejność, a jeśli tak, to podczas testowania: czy to "zbieg okoliczności" czy określone zachowanie? Ponadto: czy mysql zresetował numer 'auto_increment' po zrzuceniu kolumny? Jeśli nie, możesz to wyraźnie ustawić lub kontynuować liczenie. I na koniec: jak expencive stałoby się dla dużych stołów? – Nanne

+0

Jeśli "auto_increment_increment" nie jest 1 (w konfiguracji multi-master), to nie będzie działać poprawnie. Jeśli stół jest duży, jego uruchomienie potrwa długo. –

2

Następujące będzie NOT prac:

DELETE 
FROM table_name 
WHERE id IN 
    (SELECT id 
    FROM table_name 
    ORDER BY   --- whatever 
    LIMIT 10, 30 
) 

ale będzie to:

DELETE 
FROM table_name 
WHERE id IN 
    (SELECT id 
    FROM 
     (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
) 

I to też:

DELETE table_name 
FROM table_name 
    JOIN 
    (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
    ON tmp.id = table_name.id 
+0

Myślę, że powodem "nie pracy" jest to, że ta sama tabela jest wymieniony bezpośrednio. –

0

Przy usuwaniu wiele wierszy, jest to skuteczny trik:

CREATE TABLE new LIKE real; -- empty table with same schema 
INSERT INTO new SELECT * FROM real ... LIMIT 10; -- copy the rows to _keep_ 
RENAME TABLE real TO old, new TO real; -- rearrange 
DROP TABLE old; -- clean up. 
Powiązane problemy