2011-08-06 33 views
1

我正在讀取來自XML文件的數據。由於源代碼中的錯誤,有一天,所以在加載到數據庫後,我使用此SQL語句來增加日期。嘗試增加日期字段時,MySQL給出重複的Entry錯誤?

UPDATE 2011_electricity SET DATE = DATE_ADD(DATE, INTERVAL 1 DAY) 

上週它工作得很好,但現在我得到一個錯誤:

MySQL said: 

#1062 - Duplicate entry '2011-07-20' for key 1 

我對數據字段中的一個主鍵。這是數據庫的樣子:

   date  energy daynum 
     2011-06-29 0.05 4197 
     2011-07-19 0.20 4219 
     2011-07-20 17.07 4220 
     2011-07-21 11.56 4221 
     2011-07-22 18.18 4222 
     2011-07-23 24.92 4223 
     2011-07-24 10.56 4224 
     2011-07-25 12.68 4225 
     2011-07-26 10.06 4226 
     2011-07-27 19.72 4227 
     2011-07-28 19.02 4228 
     2011-07-29 17.92 4229 
     2011-07-30 14.49 4230 
     2011-07-31 10.84 4231 
     2011-08-01 13.38 4232 
     2011-08-02 14.86 4233 

我看不到任何重複出現,所以不要理解錯誤,有沒有更好的方式來進行MySQL代碼由1遞增一天嗎?

回答

1

這聽起來像你試圖更新表上的PK值。除此之外:建議爲此表找到另一個PK。這是發生了什麼。

逐行:

  • 更新的PK爲2011-06-292011-06-30。這成功,因爲沒有與該PK值的其他行。
  • 2011-07-19的PK更新爲2011-07-20。這失敗,因爲已經有另一個PK值的行。預先存在的行的PK尚未增加。我們現在已經違反了PK約束。

建議您修改方法之一:

  • 刪除表中的所有新數據,和你現在做的從源代碼重新加載。
  • 如果刪除不是選項,則利用臨時/臨時表。您可能需要根據需要選擇性地換出行。
+0

謝謝,有道理,但它上週工作了數週的數據!我猜測臨時表是前進的方向,我不認爲我可以做任何事情就像告訴UPDATE將結果寫入新表一樣簡單。 – kitenski

2

這是一個關於MySQL的UPDATE如何工作的問題,如p.cambell解釋的那樣逐行。繞過這個問題的另一種方式,就是要明確地告訴引擎如何訂購更新(另一個MySQL怪癖):拇指

UPDATE 2011_electricity 
SET DATE = DATE_ADD(DATE, INTERVAL 1 DAY) 
ORDER BY DATE DESC 

規則:如果你想增加的PKS(或其他唯一鍵),順序下降。如果你想減少PK,按升序排列。