başka bir tablo kullanarak tablodaki kayıtları silmek?

5 Cevap php

Not: editörleri için: daha iyi bir varsa başlığını düzenleyin lütfen :)

benim soru:

Benim veritabanında iki tablo var

     -----------
     | table1   |
     |----------|
     | id       |
     |text      |
     ===========


     -----------
     | table2   |
     |----------|
     | id       |
     |text      |
     ===========

tablo1 600,000 kayıttır

table2 5.000.000 kayıtları olduğunu! :)

ne tablo1 olmayan Table2 tüm kayıtları silmek için en iyi yoldur

Ben işlemini tamamlamak için 4 saat beklemek istemiyorum çünkü yol-hızlı yolu I ana

Eğer aşağıdaki kod daha iyi bir şey var:

<?PHP
   $sql = "select text from table2";
   $result = mysql_query($sql) or die(mysql_error());
   while($row = mysql_fetch_array($result)){
        $text = $row["text"];
        $sql2 = "select id from table1 where text = '$text'";
        $query2 = mysql_query($sql2) or die(mysql_error());
        $result2 = mysql_num_rows($query2);
        if($result2==0){
             $sql3 = "delete from table2 where text = '$text'";
             $query3 = mysql_query($sql3) or die(mysql_error());
        }
   }
?>

Teşekkürler

5 Cevap

ne RDBM ele icar hakkında?

örneğin

DELETE FROM table2 WHERE text NOT IN (select distinct text from table1)

Şerefe

PS: test öncesi bazı yedekleme yapmak ...

Neden bir bayt olduğunu tablo2 için yeni bir sütun eklemek değil ve bu satır her iki tabloda ise sonra sadece true veya 'Y' o bayt ayarı bir güncelleme yapmak.

Sonra, sadece bu tek sütun kümesi yok satırları silin.

Yani IMO, basit ve hızlı olacak gibi görünüyor.

Bu deneyin:

DELETE table2 Where id NOT IN (SELECT id from table1)

Not: sorguyu çalıştırmadan önce bir yedeğini

Create table3 like table2 insert into table3 (SELECT table2.ID, TABle2.TEXT from table1 join table2 on ...) drop table2 alter table3 new name table2

Yönetim biraz içerir (yani kolayca tablolar değiştirmez / damla eğer sadece geçerli bir seçenek), ama en azından DML kısmı galiba, başka bir seçeneği geride bırakacaktır.