2009-09-17 96 views
1

注:編輯:請如果有一個更好的:)使用另一個表從表中刪除記錄?

我的問題是編輯標題:

我在我的數據庫中的兩個表

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


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

table1的60萬條記錄

表2爲5000000個記錄!! :)

什麼是刪除表2屆的所有記錄的最佳方式在不在表1

我主要的方式-the最快的方法,因爲我不想等到4小時完成的過程

你有什麼比下面的代碼好:

<?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()); 
     } 
    } 
?> 

感謝

回答

5

怎麼樣讓RDBM處理呢?

例如

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

乾杯

PS:測試前做一些備份...

+0

刪除如此大量的記錄是否會溢出事務日誌? – mjv 2009-09-17 06:58:33

+0

取決於他是否做了交易,但是如果'是'交易記錄會大大增加 – RageZ 2009-09-17 07:02:21

1

爲什麼不是一個新列添加到表2就是一個字節,然後就做一個更新如果該行在兩個表中,則將該字節設置爲true或'Y'。

然後,只刪除沒有這一列集合的行。

這似乎是最簡單和最快的IMO。

3

您的解決方案正在做這樣的事情每行2個查詢在表2表 - 這意味着幾百萬的查詢 - 這將是相當緩慢^^

使用MySQL,你也許可以刪除所有這隻有一個查詢:DELETE指令可用於從多個表中刪除數據。

的第一件事是寫的選擇指令,將匹配要刪除(這是一個更好的方式來測試比試圖刪除不知道它是否真的會用正確的數據處理)的數據;這樣的事情可以做:

select table2.* 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

這應該讓你的所有數據是表2中,而不是在表1。

一旦確認這個查詢得到正確的數據,可以將其轉換爲刪除查詢:

delete table2 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

這可能會做 - 當然,這將是最好的先行先試上一試數據庫,而不是你的產品!

否則,具有IN和子查詢的東西可能會這樣;有點像

delete 
from table2 
where text not in (select text from table1) 

不知道會是怎樣更快,不過,考慮到你的數據量 - 仍然無論哪種方式,我不會做那種你提出的PHP循環,但將與SQL去查詢可以自行刪除所有內容:避免從PHP到數據庫的所有調用將使事情變得更快!

1

試試這個:

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

注:運行查詢

0

創建表3樣表2 插入到表3之前,請備份(SELECT table2.ID,TABle2.TEXT從表1的加入表2。 ..) 降表2 ALTER表3新名稱表2

包含一點點管理的(所以它只有在你可以很容易地下降/變更表的有效選項),但至少DML部分無線將超越其他任何選擇,methinks。