使用重复键更新在 MariaDB 中批量插入

Posted

技术标签:

【中文标题】使用重复键更新在 MariaDB 中批量插入【英文标题】:Batch insert in MariaDB with on duplicate key update 【发布时间】:2017-01-31 01:26:20 【问题描述】:

我有下表 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%。

为什么有些查询失败,然后第二次执行时没有产生错误?

【问题讨论】:

我认为您的 sql 没有意义(不是以粗鲁的方式)....我认为您应该执行以下操作,例如,如果您想更新列表,则: INSERT INTO cl(list, contact) 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 = ?.... 这个想法是不要更改表中已有的记录。在任何情况下,失败都不是因为存在重复:运行查询时表中没有具有相同键的记录。 但我还是不明白...on key duplicate update 主要用于当您也将 id 作为参数传递时,例如:INSERT INTO cl(id,list, contact) VALUES (?,?, ?) ON DUPLICATE KEY UPDATE cl.id = cl.id...您没有传递 id,并且如果 id 也是自动递增的,那么您永远不应该到达 on dup 密钥更新部分..... 由于联系人和列表上的唯一索引而命中列表和联系人的唯一组合时达到重复。 Mmmmm....还不清楚....顺便说一句,这句话在文档上看起来很有趣:It is not recommended to use this statement on tables with more than one unique index..... 【参考方案1】:

将查询更改为

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

解决了这个问题。虽然不清楚 mysql 为什么抛出 java.sql.SQLSyntaxErrorException 而不是更明确的东西。

【讨论】:

以上是关于使用重复键更新在 MariaDB 中批量插入的主要内容,如果未能解决你的问题,请参考以下文章

sql mysql批量插入,具有重复键更新(upsert),并具有条件数据更新

Mysql 批量插入事务唯一键重复处理

Mysql 批量插入事务唯一键重复处理

批量从Dataframe插入到DB,忽略Pyspark中的失败行

MyCat批量插入

jdbc 批量插入和查询与使用生成键的单次插入