2012-08-30 19 views
5

benim veritabanında yetim mesajları silmeye çalışıyorum içinde LİMİT ile JOIN kullanarak DELETE ve ben bu sorguyu oluşturduk:SOL MySQL

DELETE post.* 
     FROM foro_post AS post 
     LEFT JOIN foro_thread AS thread USING(threadid) 
     WHERE thread.threadid IS NULL 

sorun Masamın 7.000.000 üzerinde olduğundan sınırlamak istediğiniz olmasıdır kayıtları.

Ben sorgusu ile LIMIT kullanamazsınız gibi

, bunu denedim ve gerçekten çalıştı ama verimli bir çözüm olup olmadığından emin değilim ya da daha iyisini yapılabilir eğer.

DELETE post.* 
     FROM foro_post AS post 
     LEFT JOIN foro_thread AS thread USING(threadid) 
     WHERE thread.threadid IS NULL 
     AND post.postid < 500 

     // Where < 500 should be increasing as I delete records 

Bunu daha verimli bir şekilde nasıl yapabilirim?

Teşekkürler!

+0

Neden 'LIMIT' kullanamıyorum? – Kermit

+1

@njk "Kendi SQL sözdizimi bir hata var; hattında 5 de yakın 'LIMIT 1' kullanma hakkı sözdizimi için MySQL sunucu sürümü ile uyumlu kılavuzu" Ben – Santiago

cevap

8

aynı anda birden fazla tablo başvuran yaparken doğrudan DELETE içinde LIMIT kullanamaz, ama sen bir subselect içinde silmek istediğini üzerini kapatmaktan bu sorunun üstesinden gelebilirsiniz:

DELETE po 
FROM foro_post po 
JOIN (
     SELECT p.postid 
     FROM  foro_post p 
     LEFT JOIN foro_thread t ON p.threadid = t.threadid 
     WHERE  t.threadid IS NULL 
     ORDER BY p.postid 
     LIMIT  50 
     ) pp ON po.postid = pp.postid 
+0

KATILIN SOL LIMIT kullanamaz Görünüşe pardon, "p.id" ne olurdu? Ben MySQL – Santiago

+0

@Santiago için oldukça yeni, yani 'post' tablonun sadece birincil anahtar. Şimdi şimdi "id" yerine "postid" olduğunu görüyorum, şimdi çözümümü ayarlıyorum. –

+0

@ zane-bien Doğrudan, çok masalı sözdiziminde değil, 'LIMIT' kullanabilirsiniz. – Kermit

0

şey belki böyle mi?

DELETE post.* 
    FROM foro_post AS post 
    LEFT JOIN foro_thread AS thread USING(threadid) 
    WHERE thread.threadid IS NULL 
    AND post.postid < 
     (SELECT MAX(postid) + 500 FROM post) 

Sen MIN() ile MAX(postid) değiştirebilir ve buna sınırı ekleyin.