MySQL - on duplicate key update 问题

前言

        相信用过MySQL的都知道on duplicate key update这个关键字吧,这是MySQL用来防止重复插入的,前提是你的表中加了唯一索引,表的结构和插入语句如下,唯一索引不懂的请自行百度.

        语句的意思就是当发生了冲突时不报错而自行更新修改时间

CREATE TABLE `test` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(20)  DEFAULT NULL COMMENT '用户名称',
  `create_time` bigint NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `user_name` (`user_name`) USING BTREE
) ENGINE=InnoDB  COMMENT='test过滤表';


dao 层

int saveOnDuplicate(UserRoleFilter userRoleFilter);


插入语句

 <insert id="saveOnDuplicate" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
        insert in
### 解决方案概述 在MySQL 5.7中遇到`ON DUPLICATE KEY UPDATE`语句报错的情况,通常涉及死锁、约束违反或其他数据库异常。为了有效处理这些问题并找到合适的解决方案,可以从以下几个方面入手: #### 死锁预防与解决措施 当多个线程尝试在同一时间向具有相同唯一键的数据间隙插入新记录时可能发生死锁现象[^1]。为了避免这种情况的发生,可以考虑调整应用程序逻辑以减少并发度或优化表结构设计来降低锁定竞争的可能性。 对于已经发生的死锁错误(如Error Code: 1213),建议采取重试机制,在捕获到此类特定类型的错误之后自动重新提交受影响的操作直到成功为止。此外还可以通过设置较低级别的隔离级别(READ COMMITTED)从而减小产生gap locks的概率进而缓解潜在的死锁风险[^5]。 #### 处理重复键冲突 如果是因为存在重复的关键字而导致无法正常执行,则应确保所使用的SQL语句正确指定了如何应对这种情形下的行为。例如利用`ON DUPLICATE KEY UPDATE`特性可以在检测到主键或唯一索引冲突时更新已有的行而非抛出错误消息[^3]。 ```sql INSERT INTO table_name (id, name) VALUES (1,'Alice') ON DUPLICATE KEY UPDATE name=VALUES(name); ``` 上述代码片段展示了怎样安全地处理可能存在的重复ID情况——即使目标记录已经被占用也会相应修改其name字段的内容而不至于失败退出。 #### 验证数据完整性 有时问题根源在于试图插入不符合预期模式的数据集内;因此有必要事先验证待写入的信息是否满足既定条件限制。比如检查外键关联的有效性、字符长度合规与否等等因素均有可能触发相应的警告提示甚至致命性的中断事件。 另外值得注意的一点是在某些特殊情况下可能会因为隐含转换规则引起意外的结果,故而在编写具体实现之前最好先查阅官方文档确认各类型之间的映射关系以便做出恰当的选择[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值