我是靠谱客的博主 含糊外套,最近开发中收集的这篇文章主要介绍mysql 的秘钥,使用主键和唯一键重复密钥更新的Mysql,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我有一个表,其中包含一个自动递增的主键和一个唯一键:

CREATE TABLE `product` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`canonical_url` varchar(750) CHARACTER SET latin1 NOT NULL,

...

PRIMARY KEY (`id`),

UNIQUE KEY `canonical_url_idx` (`canonical_url`)

如果canonical_url已经存在,我使用on duplicate key功能更新记录:

"INSERT INTO product(id, canonical_url, name VALUES(?, ? ?) ON DUPLICATE KEY UPDATE name=VALUES(name), id=LAST_INSERT_ID(id)"

KeyHolder productKeyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(conn -> {

PreparedStatement ps = conn.prepareStatement(productSql, new String[] {"id"});

ps.setInt(1, id);

ps.setString(2, canonicalUrl);

ps.setString(3, name);

}, productKeyHolder);

final int productId = productKeyHolder.getKey().intValue();

问题是我收到了这个错误:

只有在返回单个键时才应使用getKey方法.当前键条目包含多个键:[{GENERATED_KEY = 594},{GENERATED_KEY = 595}]

有谁知道是什么原因造成的?

解决方法:

我自己就碰到了这个.根据这里的文件:

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, and 2 if an existing row is updated.

因此,当您的查询执行时,如果插入了新记录,则返回其ID.如果记录已存在,则更新现有记录.如果不需要更新,因为值全部匹配,则返回ID并且修改的行数为0.但是,如果更新记录,则返回ID并修改行数为2.密钥持有者假定为2行已被修改(即使只有一行)并且错误地返回ID加上下一个顺序ID(即ID加1).

为了解决这个问题,我在尝试调用getKey之前只检查了getKeys中的计数.如果getKeys中有多个值,我将不会调用getKey.

标签:spring-jdbc,mysql

来源: https://codeday.me/bug/20190823/1695209.html

最后

以上就是含糊外套为你收集整理的mysql 的秘钥,使用主键和唯一键重复密钥更新的Mysql的全部内容,希望文章能够帮你解决mysql 的秘钥,使用主键和唯一键重复密钥更新的Mysql所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部