2012-02-01 216 views
0

我有一個程序,將更新每一分鐘。每次更新時,都會添加時間,日期,需求,或者根據相同的時間和日期更新需求。但是,我目前的代碼不允許我這樣做。我試着添加另一個代碼來糾正這個問題,但它不起作用。有誰知道如何添加一個約束,以便當它遇到相同的數據和時間,但需求不同時,它只會用新的需求更新數據庫。而不是添加包含相同時間和日期但需求不同的新行。通過java更新mysql數據庫

我的原代碼:

preparedStatement = connect 
.prepareStatement("insert into testdb.emcsg values (?, ?, ? , ?, ?)"); 
preparedStatement.setInt(1, count+1); 
preparedStatement.setString(2, d1); 
preparedStatement.setString(3, d2); 
preparedStatement.setString(4, d3); 
preparedStatement.setString(5, d4); 
preparedStatement.executeUpdate(); 

我編輯的代碼:

preparedStatement = connect 
.prepareStatement("insert INTO testdb.emcsg values (?, ?, ? , ?, ?) ON DUPLICATE KEY UPDATE 5"); 
preparedStatement.setInt(1, count+1); 
preparedStatement.setString(2, d1); 
preparedStatement.setString(3, d2); 
preparedStatement.setString(4, d3); 
preparedStatement.setString(5, d4); 
preparedStatement.executeUpdate(); 

,這些修改的代碼想出了一個錯誤 「您的SQL語法錯誤;」建議和幫助將不勝感激!

+0

是否有更多的錯誤可以發佈? – 2012-02-01 12:30:15

+0

您是否通過在mysql控制檯中手動執行測試查詢來檢查語法? – Thomas 2012-02-01 12:32:18

+0

嗨,不,我使用本網站所提供的語法http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Eugene 2012-02-01 12:34:41

回答

3

The documentation表明您必須在條款的最後有一個任務:

insert into testdb.emcsg (a, b, c, d, e) values (?, ?, ? , ?, ?) 
ON DUPLICATE KEY UPDATE e = ? 

請注意,這是一個很好的做法,列出列名在INSERT語句中,而不是依靠他們的順序定義,並在維護者知道這個命令。

+0

嗨JB Nizet,感謝您的及時回覆。我有一個問題要問。這是更新只能在一個主鍵不與相同數據重複的條件下進行。但是,在我的情況下,我想要設置3個鍵必須是相同的,否則,這個東西會被更新。可能嗎? – Eugene 2012-02-01 12:48:18

+0

如果你在這個元組上有一個唯一的索引,它應該可以工作。或者你可以發出一個選擇查詢,然後插入或更新,具體取決於選擇的結果。 – 2012-02-01 12:55:42

+0

嗯..我仍然無法得到它。也許我可以說明這一點: 日期時間需求 01-JAN 01:00-02:00 500 01-JAN 02:00-03:00 600 不過,我加入了新的數據,新的需求值 01-Jan 01:00-02:00 700 我希望系統用新的需求值進行更新。但是,它必須能夠區分要更新的行。在這種情況下,需要2個唯一的密鑰? – Eugene 2012-02-01 13:15:02

0

documentation看來,你可能需要參考您要更新的列名(一個或多個)。例如(a,b,c,d,e應該用您的實際列名取代):

preparedStatement = connect 
.prepareStatement("insert INTO testdb.emcsg(a,b,c,d,e) values (?, ?, ? , ?, ?) ON DUPLICATE KEY UPDATE e=VALUES(e)"); 
preparedStatement.setInt(1, count+1); 
preparedStatement.setString(2, d1); 
preparedStatement.setString(3, d2); 
preparedStatement.setString(4, d3); 
preparedStatement.setString(5, d4); 
preparedStatement.executeUpdate();