2011-07-03 19 views
8

mysql'de select * ... LIMIT 10, 30 numarasını sorgulayabilirim; burada 10 atlanacak kayıt sayısını gösterir.Mysql'deki nth satırından sonra her kayıt nasıl silinir?

Aynı şeyi, ilk 10 kayıttan sonraki her kaydın silindiği silme ifadelerinde nasıl yapabileceğimi bilen var mı? (Oracle gibi) MySQL hiçbir rowId yoktur düşünüldüğünde

+0

senin masa mı? –

+0

bir GUID dizesidir. – Roman

+0

Bu silinmiş yanıttan bahsetmem gerekir: 'TABLO NEREDEN İDDİLE TUT (TABLE LIMIT 10, 30'dan SELECT ID)'. @Am, bunun "MySQL'in bu sürümünde" çalışmadığını belirtti. Yani bu soruya cevap olmasa da, diğer cevaplayıcılara yardımcı olabilir :) – Nanne

cevap

8

, şu öneririm:

alter table mytable add id int unique auto_increment not null; 

Bu otomatik sipariş ile koşullar veya olmayan bir select açıklamada sırasına göre Satırlarınızı kişi olacaktır. sırasını kontrol

delete from mytable where id > 10; 

Son olarak (belki ve tablonun bir dökümü) ihtiyaçlarınız ile tutarlı sonra Sonra

select * from mytable; 

, o sahadan

alter table mytable drop id; 
+0

Bazı sorular: "auto_increment" ifadesinin eklenmesi, böyle bir tabloyu değiştirirken nasıl sayılacağı tanımlandı mı? Gerekli sırayı bekler miydi, eğer test edilirse: bu "tesadüf" veya tanımlanmış davranış mı? Ayrıca: mysql sütunu bıraktıktan sonra 'auto_increment' sayısını sıfırlıyor mu? Aksi takdirde, bunu açıkça ayarlamak isteyebilirsiniz veya saymaya devam edebilir. Son olarak, bu büyük masalar için nasıl bir etki yaratır? – Nanne

+0

Eğer auto_increment_increment' 1 değilse (çoklu-ana kurulumda), bu çok düzgün çalışmayacaktır. Ayrıca, masa büyükse koşmak uzun zaman alacaktır. –

2

kaldırmak isteyebilirsiniz Aşağıdaki NOT çalışmayacaktır

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

Ama bu irade:

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

Ve bu da:

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

"Çalışmama" nın nedeninin aynı tablonun doğrudan söz konusu olduğunu düşünüyorum. –

0

satır bir çok silme, bu verimli bir hiledir: anahtar nedir

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.