java duplicate key_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(描述为here)以下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 if

>尝试的INSERT被中止,因为它会导致重复的UNIQUE键值,和

>指定的ON DUPLICATE KEY UPDATE更改实际上不会修改现有行中的任何值.

这可以通过使用完全相同的参数值连续两次运行上述测试代码来确认.请注意,UPDATE … id = LAST_INSERT_ID(id)“trick”确保返回正确的id值.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值