使用主键和唯一键重复密钥更新的Mysql
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用主键和唯一键重复密钥更新的Mysql,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1518字,纯文字阅读大概需要3分钟。
内容图文
我有一个表,其中包含一个自动递增的主键和一个唯一键:
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}]
有谁知道是什么原因造成的?
解决方法:
我自己就碰到了这个.根据这里的文件:
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
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.
内容总结
以上是互联网集市为您收集整理的使用主键和唯一键重复密钥更新的Mysql全部内容,希望文章能够帮你解决使用主键和唯一键重复密钥更新的Mysql所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。