当前位置: 首页 > 面试题库 >

MySQL在Java上的“ INSERT…ON DUPLICATE KEY UPDATE”:如何区分插入/更新/ NoChange状态

周飞
2023-03-14
问题内容

我对MySQL的INSERT … ON DUPLICATE KEY
UPDATE
语句的返回值感到困惑。当我在MySQL客户端(mysql终端,phpmyadmin或MySQL
Workbench)上尝试使用它时,执行结果将显示以下内容之一:

  • 1 :如果插入了新记录(即没有重复的密钥)。
  • 2 :如果存在重复记录,则更新现有记录。
  • 0 :如果执行更新,但没有更改列值。

这些结果是有道理的。但是,当我使用Java(使用mysql-connector
5.1.34)在Java中执行相同的查询时,如果同时插入并且没有更改,则JDBC的executeUpdate方法返回 1
,如果成功更新,则返回 2 。当更新无效时,它不会返回0。

这是MySQL JDBC驱动程序的错误吗?如果是这样,是否有没有此错误的发行版?如果这不是错误,那么如何获得与MySQL客户端返回的结果相同的结果?


问题答案:

似乎您需要 useAffectedRows 手动设置驱动程序属性。

经过一番谷歌搜索后,我得到了解决方案。如果JDBC
ExecuteUpdate中没有更改,则
可以将此INSERT ON
DUPLICATE KEY UPDATE返回0的 MySql
Bug引用。

同样在讨论中指出他们在5.1.7中发布了它

编辑第二个问题:

useAffectedRows

连接到服务器时不要设置CLIENT_FOUND_ROWS标志(不兼容JDBC,将破坏大多数依赖“发现”行与“受影响行”的DML语句的应用程序),但确实会导致“”的更新计数“正确”服务器将返回“
INSERT … ON DUPLICATE KEY UPDATE”语句。

默认值:false

由于版本:5.1.7

JDBC Connector-j中的参考useAffectedRows



 类似资料:
  • 好吧,问题不是关于如何返回ID,而是更像是如何跳过它...我有一种情况,我使用last_insert_id()获取最后插入行的id,但如果没有插入行,我想得到一个零。问题如下: < li >我插入...更新一些记录:由于这些行是新插入的,所以返回所有id < li >然后我重复该过程:这次不返回id。耶!这正是我想要的 < li >我更改了一个列值并重复该过程:但现在返回的是我更改了列值的行的ID

  • 区分状态和更新 在Subversion,我们已经设法抹去cvs status和cvs update之间的混乱。 cvs status命令有两个目的:第一,显示用户在工作拷贝的所有本地修改,第二,显示给用户哪些文件是最新的。很不幸,因为CVS难以阅读的状态输出,许多CVS用户并没有充分利用这个命令的好处。相反,他们慢慢习惯运行cvs update或cvs -n update来快速查看区别,如果用户忘

  • 问题内容: 我想向数据库表中添加一行,但是如果存在具有相同唯一键的行,我想更新该行。 例如: 假设唯一键为,并且在我的 数据库 中有一行。在这种情况下,我想用这些值更新该行。通常,这会产生错误。 如果使用它,将忽略该错误,但仍不会更新。 问题答案: 采用 查询:

  • 问题内容: 我有一些看起来像这样的代码。我必须保留表中的一个自动递增字段(在其他表中使用)。我想简化和优化此代码。 编辑:主键ID是自动递增的字段。我永远都不想改变。但是,当另一个字段重复时,这就是我要更新该记录的时间。 问题答案: 如何替换成: 假设col1是您的主键,如果已经存在一个值为’foo’的行,它将更新其他两列。否则,它将插入新行。

  • 问题内容: 我有一张桌子,就是PK。当我插入行时,将有重复的键,并且我需要总结三个统计信息。我在Java中对PreparedStatement使用以下查询: 是否有更简洁的查询来实现?因为我简化了查询,所以那里有十多个统计信息。 问题答案:

  • 问题内容: 有没有办法像在MySQL服务器上那样批量执行查询? 将无法使用,因为如果该字段已经存在,它将直接忽略该字段并且不插入任何内容。 将无法工作,因为如果该字段已经存在,它将首先对其进行处理,然后再次进行处理,而不是对其进行更新。 可以使用,但不能批量使用。 因此,我想知道是否可以批量发出这样的命令(一次不止一次发送)。 问题答案: 您 可以 使用INSERT … ON DUPLICATE