2009-01-02 61 views
0

我已經通讀類似問題的解決方案,但它們似乎都涉及腳本和額外的工具。我希望我的問題很簡單,以避免這種情況。MySQL數據庫的最佳更新方法

因此,用戶上傳下週數據的csv。它被插入到數據庫中,沒有問題。

一個小時後,他得到的反饋,從每個人,必須相應地進行更新。他更新了csv並將其上傳到數據庫。

現在,我正在使用的系統檢查該星期的數據是否已經存在,如果是,則從數據庫中提取所有數據,腳本找到差異併發送出去,並在這之後,數據舊數據被刪除並替換爲新數據。

很顯然,擦拭乾淨並重新輸入數據要容易得多,但不是最好的方法,特別是如果有大量更改或大量數據。但是我必須知道發送警報有什麼變化。但我不想要一個事務日誌,因爲這些警報只需要一次發送出去,之後,舊的數據就沒用了。

所以!

是否有一種巧妙的方法將新數據與已有數據進行比較,僅獲取更改/刪除/添加的行並進行更改?現在,似乎我可以做一個更新,但我不會得到任何迴應什麼變化...

謝謝!

快速編輯:

目前沒有外鍵正在使用。這很快就會改變,但它不應該有所作爲,因爲外鍵只會指向數據的影響,因此不需要改變。至於主鍵,這確實存在一點困難:

有問題的數據是每個人的工作時間表。所以這將是很好的(對於這個時間表的具體應用,除了簡單的輸出)每個班次都有一把鑰匙。但問題是,假設用戶1在星期一晚了。遲到記錄在一個單獨的表格中,並使用shift鍵與班次掛鉤。但是,如果週二有一些需要對已經進行的一週進行一些更改,我擔心的是確保數據庫中已經發生的所有條目變得很難(並且因此可能具有不應該的關聯被打破)將在這個過程中重新被鎖定。不幸的是,這並不像只更新當前時間之後發生的所有事件那樣簡單,因爲這會增加上傳人員的工作(並且因此使其不易上市)。基本上,他們在一個程序上製作時間表,將其導出爲CSV,然後將其上傳到所有需要該數據的Web應用程序的網頁上。所以對他們來說簡單得多(每個參與者的壓力都小),每次出口整個星期並上傳時都要做同樣的例程。

所以我最大的擔心就是讓上傳腳本在兩端都儘可能的聰明。它不會因爲試圖找到更改而變得臃腫,它可以找到更改,而不管輸入是什麼,並且沒有任何未更改的數據有被重新鍵入的風險。

這裏有一個相關的問題:

Suppose Joe User was schedule to wash dishes from 7:00 PM to 8:00 PM, but the new 
data has him working 6:45 PM to 8:30 PM. Has the shift been changed? Or has the old 
one been deleted and a new one added? 

而另一個問題:

Say Jane was schedule to work 1:00 PM to 3:00 PM, but now everyone has a mandatory 
staff meeting at 2:00 to 3:00. Has she lost one shift and gained two? Or has one 
shift changed and she gained one? 

我知道如何這種數據通常被處理真正感興趣/走近,更不是具體的答案以上。

再次,謝謝。

回答

0

眼下,該系統我使用的檢查,看是否該週數據已經存在,如果是,提取所有從數據庫數據的,一個腳本發現的差異,並把它們發送出去,經過這一切,舊的數據被刪除,並用新的數據替換的數據。

所以你的腳本知道的區別,對不對?除了腳本和MySQL之外,你不想使用額外的額外工具,對嗎?

我很相信,MySQL的本身並不提供任何「差異」的工具,這樣你就可以達到最佳的是使新的CSV文件只更新。我的意思是 - 它應該只包含更改的行。更新會更快,所有更改的數據都可以輕鬆獲得。

0

如果您對中的一個字段的唯一密鑰,您可以使用:

LOAD DATA LOCAL INFILE '/path/to/data.csv' REPLACE INTO TABLE table_name 
+0

我建議你檢查,如果LOAD DATA(...)更換使用相同的語義爲MySQL的「替換」命令。 「替換」執行「刪除」,然後「插入」,但它會導致「ON DELETE」觸發器被調用,並進行foregin鍵檢查,「ON DELETE CASCADE」刪除外鍵... – Abgan 2009-01-02 15:39:14

相關問題