2011-09-01 94 views
0

如何檢查MySQL中的重複記錄?
我的cronjob每分鐘運行一次。
因此,我每分鐘都在MySQL中插入相同的結果。
如何確保只有非共享記錄被插入到數據庫中,並且重複記錄被拒絕。檢查重複記錄

這裏是我的代碼:

if($trim != $yesterdayresult){            
    while($user = mysql_fetch_array($checklist)){ 
    $usernumber = $user['msisdn']; 
    $usertelco = $user['telco']; 
    $userkw = $user['kw']; 
    $usersc = $user['shortcode']; 
    mysql_query("INSERT INTO mt_log 
      VALUES 
      ('','$Currentdatetime','$usernumber','$usertelco','$finalresult' 
      ,'$userkw','$usersc','$price')"); 
    } 
} else {echo "Results have not updated yet, please wait";} 
+2

如何在此記錄中定義雙重性? 寫下你所指定的行列的列表 – palmic

+2

我有一個**真的很難理解你寫的東西......如果我忽略文本的部分內容,只是猜測,我大部分都可以理解它你想要什麼 – shesek

+1

看看http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – cristian

回答

1

我的cronjob必須在運行每分鐘

你正在運行的每一分鐘一個cronjob?這不是一個好主意。雖然現在有理由期望在專用計算機上的平均抖動在幾秒鐘的範圍內,但仍需要額外的控制來管理運行時重疊 - 尤其是在使用ISAM數據表的情況下。如果需要處理,這個守護進程通常會更加可靠。

如何檢查重複的記錄在MySQL

我沒有看到你的代碼是如何檢查重複。如果你發現重複,你想做什麼?

如果您不想在數據庫中重複記錄,則在字段上創建一個唯一鍵,這會導致記錄重複,然後使用'INSERT'並處理ER_DUP_KEY錯誤或'INSERT IGNORE'或'INSERT IGNORE' REPLACE'或'INSERT .... ON DUPLICATE ....'

我必須在mysql中插入所有記錄,然後再一分鐘它不會再插入。

所以你需要一個新的列存儲的唯一索引(NOW() - 間隔SECOND()秒)

但它聽起來就像你正在創建一個非規範化的數據庫 - 這又是一個壞實踐。對數據庫進行非規範化是有原因的,特別是在預先合併結果方面 - 但是在1分鐘的分辨率下,你不會獲得任何性能優勢。

看看您提供的實際代碼,這看起來像某種電話計費應用程序 - 在這種情況下,您的計量方式完全錯誤 - 您應該只記錄每次呼叫的開始和結束時間。 (順便說一下,依賴DML操作的列順序/編號,而不是明確地說明值映射到任何關係數據庫上的列也是sl)不馴)。

1

防止重複行MySQL中

如果你想防止重複插入記錄,您指定您希望成爲唯一字段的組合UNIQUE指數。

ALTER TABLE mt_log ADD UNIQUE INDEX ui_indexname (column1, column2); 

之後,MySQL將拒絕任何重複的行。

正確的方式在MySQL

插入我建議你明確命名列:

INSERT IGNORE INTO mt_log (columname1, columnname2, .....) VALUES (.....) 

IGNORE部分忽略的錯誤,所以,如果你在一個去插入多行,你有重複在第一行(但不是第二行),它不會停止,但只是忽略第一個插入並繼續到第二行。

如果您不想指定列的值,請不要插入'',而是使用null

如果要覆蓋上重複的行

如果你想重複行總是反映最新的數據,這樣做:

INSERT IGNORE INTO mtlog (columnname1, columnname2, ...) 
VALUES (...) ON DUPLICATE KEY UPDATE 
SET non_duplicate_columnname = '$value1', non_duplicate_columnname2 = '$value2' 

參見:
http://dev.mysql.com/doc/refman/5.5/en/alter-table.html
http://dev.mysql.com/doc/refman/5.5/en/insert.html
http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html