2016-09-22 174 views
0

我有如下表CL:批量插入與重複鍵更新

id - int(10) primary key 
contact - int(10) 
list - int(10) 

隨着接觸和列表中的唯一索引。當我同時運行了100條記錄批量以下查詢:

INSERT INTO cl(list, contact) VALUES (?, ?) ON DUPLICATE KEY UPDATE cl.id = cl.id 

在高壓下它在大約20%失敗,出現以下錯誤:查詢

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ON DUPLICATE KEY UPDATE cl.id = cl.id' at line 1 

80%,運行良好。當我用相同的參數重新運行失敗的查詢時,又有20%失敗。

爲什麼某些查詢失敗,然後在第二次執行時不會產生錯誤?

+0

我認爲你的sql沒有意義(不以粗魯的方式)....我認爲你應該這樣做,例如,如果你想更新列表,那麼:'INSERT INTO cl(列表,聯繫人)VALUES(?,?)ON DUPLICATE KEY UPDATE list =?'...或者如果你想更新聯繫人,那麼你應該嘗試:INSERT INTO cl(list,contact)VALUES(?,?)ON DUPLICATE KEY UPDATE contact =?'...或者如果你想同時更新:'INSERT INTO cl(list,contact)VALUES(?,?)ON DUPLICATE KEY UPDATE list =?,contact =?'...... – Hackerman

+0

這個想法不會改變表中已有的記錄。在任何情況下,失敗都不是由於存在重複的事實:查詢運行時,表中沒有具有相同鍵的記錄。 – alniks

+0

但是我還是不明白...''on key duplicate update''主要用於傳遞id作爲參數時,如:'INSERT INTO cl(id,list,contact)VALUES(?,?,? )在重複密鑰更新cl.id = cl.id' ...你沒有通過身份證,如果該身份證也是自動增量,那麼你應該永遠不會去達到關鍵更新部分..... – Hackerman

回答

0

更改查詢

INSERT IGNORE INTO cl(list, contact) VALUES (?, ?) 

解決的問題。雖然目前還不清楚爲什麼mysql拋出java.sql.SQLSyntaxErrorException而不是更明確的東西。