栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java PreparedStatement和ON DUPLICATE KEY UPDATE:我如何知道是插入行还是更新行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java PreparedStatement和ON DUPLICATE KEY UPDATE:我如何知道是插入行还是更新行?

考虑下面的MySQL测试表:

CREATE TABLE `customers` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(100) NOT NULL,  `email` varchar(100) NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `email` (`email`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

现有的样本数据如下:

id  name email--  --------------  ---------------- 1  Loblaw, Bob     bob@example.com 2  Thompson, Gord  gord@example.com

使用默认的连接设置

compensateonDuplicateKeyUpdateCounts=false
(此处描述),以下Java代码

PreparedStatement ps = dbConnection.prepareStatement(        "INSERT INTO customers (name, email) " +        "VALUES (?, ?) " +        "ON DUPLICATE KEY UPDATE " + "name = VALUES(name), " + "id = LAST_INSERT_ID(id)");ps.setString(1, "McMack, Mike");ps.setString(2, "mike@example.com");int euReturnValue = ps.executeUpdate();System.out.printf("executeUpdate returned %d%n", euReturnValue);Statement s = dbConnection.createStatement();ResultSet rs = s.executeQuery("SELECT LAST_INSERT_ID() AS n");rs.next();int affectedId = rs.getInt(1);if (euReturnValue == 1) {    System.out.printf("    => A new row was inserted: id=%d%n", affectedId);}else {    System.out.printf("    => An existing row was updated: id=%d%n", affectedId);}

产生以下控制台输出

executeUpdate returned 1    => A new row was inserted: id=3

现在,再次使用参数值运行相同的代码

ps.setString(1, "Loblaw, Robert");ps.setString(2, "bob@example.com");

控制台输出是

executeUpdate returned 2    => An existing row was updated: id=1

这表明

.executeUpdate
如果唯一索引导致现有行被更新,则实际上可以返回2。如果您需要有关 实际
测试代码的进一步帮助,则应编辑问题以包括该问题。

编辑

进一步的测试表明,

.executeUpdate
如果

  1. 尝试的INSERT被中止,因为它将导致重复的UNIQUE键值, 并且
  2. 指定的ON DUPLICATE KEY UPDATE更改 实际上不会修改现有行中的任何值

可以通过使用完全相同的参数值连续两次运行上述测试代码来确认这一点。请注意,

UPDATE ... id =LAST_INSERT_ID(id)
“技巧”确实可以确保
id
返回正确的值。

如果唯一要插入的值是UNIQUE键值,这可能可以解释OP的测试结果。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号