ON DUPLICATE KEY UPDATE

1、有时候遇到问题:
(1)在新增数据或者更新数据的时候,经常先判断,该表中是否有数据,如果有,则更新,如果没有,则插入。

(2)有时候有的msyql字段,需要在原有基础上进行累加,比如点读一本书的时长。
因此引入ON DUPLICATE KEY UPDATE,进行批量操作。

2、前提:该语句是基于唯一索引或主键使用,需要建立unique index 索引,
3、mybatis中的语句,举例:
fk_login_id, study_date为unique index

 @Insert({ "<script>",
            "INSERT INTO ddb_learn_log_day_trace(id,fk_login_id,study_date,count_time,book_study_time,spoken_test_time,exercises_time,read_time,other_time,read_num,spoken_num,spoken_sixty_points_less,spoken_eighty_points_more,sum_spoken_score,create_date,update_date) ",
            "VALUES ",
            // logDayTraces为插入集合
            "<when test='logDayTraces!=null'>",
            "<foreach collection='logDayTraces' item='logDayTrace' separator=','>",
                "(#{logDayTrace.id},#{logDayTrace.fkLoginId},#{logDayTrace.studyDate},#{logDayTrace.countTime},#{logDayTrace.bookStudyTime},#{logDayTrace.spokenTestTime},#{logDayTrace.exercisesTime},#{logDayTrace.readTime},#{logDayTrace.otherTime},#{logDayTrace.readNum},#{logDayTrace.spokenNum},#{logDayTrace.spokenSixtyPointsLess},#{logDayTrace.spokenEightyPointsMore},#{logDayTrace.sumSpokenScore},#{logDayTrace.createDate},#{logDayTrace.updateDate})",
            "</foreach>", "</when>", "ON DUPLICATE KEY UPDATE ",
            // 该字段累加数据
            "count_time = count_time + VALUES(count_time),",
             // 该字段累加数据
            "book_study_time = book_study_time + VALUES(book_study_time),",
             // 该字段累加数据
            "spoken_test_time = spoken_test_time + VALUES(spoken_test_time),",
            
            "exercises_time = exercises_time + VALUES(exercises_time),", "read_time = read_time + VALUES(read_time),",
            "other_time = other_time + VALUES(other_time),", "read_num = read_num + VALUES(read_num),",
            "spoken_num = spoken_num + VALUES(spoken_num),",
            "spoken_sixty_points_less = spoken_sixty_points_less + VALUES(spoken_sixty_points_less),",
            "spoken_eighty_points_more = spoken_eighty_points_more + VALUES(spoken_eighty_points_more),",
            "sum_spoken_score = sum_spoken_score + VALUES(sum_spoken_score),", "update_date = VALUES(update_date)",
            "</script>" })
### SQL `ON DUPLICATE KEY UPDATE` 语法及用法 当向数据库表中插入数据时,可能会遇到唯一键或主键冲突的情况。为了处理这种情况并更新已存在的记录而非抛出错误,可以使用 `ON DUPLICATE KEY UPDATE` 子句。 #### 基本语法结构 基本的 `INSERT INTO...ON DUPLICATE KEY UPDATE` 的语法规则如下: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2); ``` 此命令尝试将新行插入到指定表格中;如果有任何唯一索引列或主键发生冲突,则会触发更新操作而不是插入新的记录[^1]。 对于具体的例子来说,在MySQL环境中,假设有一个名为 `users` 的表,其中包含两个字段:`id` 和 `username` ,并且 `id` 是唯一的。下面是一个如何利用该特性来避免重复条目同时修改现有信息的例子: ```sql INSERT INTO users (id, username) VALUES (1, '张三') ON DUPLICATE KEY UPDATE username = VALUES(username); ``` 这段代码表示如果 `id=1` 已经存在于 `users` 表内,则应将其对应的用户名更改为 `'张三'` 而不是创建另一个具有相同ID的新用户记录[^2]。 值得注意的是,在 MySQL 8.0 版本以前,要达到同样的效果往往依赖于这条指令。而在较新的版本里,虽然功能保持不变,但是内部机制可能有所改进以提高性能和可靠性[^3]。 另外一个重要细节是未被提及但在实际应用中有意义的一点——即那些既不在 `INSERT` 部分也不在 `UPDATE` 部分显式提到的其他非空缺省值将会丢失其原始内容而变为 NULL 。这就好像是先删除旧纪录然后再重新加入一样[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值