Java 在MariaDB中批量插入,并在重复密钥更新时插入
我有下表:Java 在MariaDB中批量插入,并在重复密钥更新时插入,java,mysql,sql,jdbc,mariadb,Java,Mysql,Sql,Jdbc,Mariadb,我有下表: 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
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%
为什么某些查询在第二次执行时失败,然后不产生错误?将查询更改为
INSERT IGNORE INTO cl(list, contact) VALUES (?, ?)
解决了这个问题。虽然还不清楚为什么mysql会抛出java.sql.SQLSyntaxErrorException而不是更明确的东西。我认为您的sql没有意义(不是粗鲁的)…我认为您应该做一些事情,例如,如果您想更新列表,那么:
插入cl(列表,联系人)值(?,)在重复密钥更新列表=?
…上,或者如果要更新联系人,则应尝试:在重复密钥更新联系人=?上插入cl(列表,联系人)值(?),或者如果要同时更新这两个值:在重复密钥更新列表=?,contact=?
…想法是不要更改表中已有的记录。在任何情况下,失败都不是因为存在重复项:当查询运行时,表中没有具有相同键的记录。但我仍然不理解…on key duplicate update
主要用于将id作为参数传递时,例如:插入cl(id,list,contact)值(?,?)在重复密钥更新cl.id=cl.id
…时,您没有传递id,如果id也是自动递增的,然后,您永远不应该访问on dup密钥更新部分…..由于联系人和列表上的唯一索引,当命中列表和联系人的唯一组合时,将达到on dup。Mmmmm…仍然不清楚…..顺便说一句,在文档中,此短语看起来很有趣:不建议在具有多个唯一索引的表上使用此语句索引。
。。。。