mybatis中使用insert into... ON DUPLICATE KEY UPDATE详解

本文探讨了在处理数据插入时如何避免重复,介绍了ONDUPLICATEKEYUPDATE和insertignoreintotable的使用场景,以及如何通过主键或联合主键判断是否已存在。特别强调了在多主键表中注意事项,并给出了MyBatis中使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

insert数据的时候,我们可能不知道这个数据是否已经被插入过,或者在批处理中有时候可能会多次处理同一个任务,这样就会有重复插入的可能,不管怎么样肯定是用到了insert into... ON DUPLICATE KEY UPDATE ,除了这个语句还有一个insert ignore into table(name)

insert ignore into table(name)是如果这个值存在则忽略这条数据,如果不存在则插入

而ON DUPLICATE KEY UPDATE是如果存在则更新,

这两个语句有一个共同的问题,就是如何判断这个语句是否存在的?

第一,主键,每个表中都必须要有主键,这个是一定可以用的

第二,联合主键:联合主键就是通过

ALTER TABLE table_name ADD CONSTRAINT key_____id UNIQUE (create_month,pid,psid);

语句进行创建的,这里,其他相关知识可以自行百度

但是,最好不要有多个主键,如果有多个key可能会导致ON DUPLICATE KEY UPDATE不知道使用哪个主键而导致数据出现脏数据,所以应该尽量避免在多(联合)主键的表中使用该语句

mybatis中使用该方法时也是一样的但是要注意插入多条数据时需要把该语句放在</foreach>后边

<insert id="saveQmStaffAchieve">
        insert into table_name (
                hospid, hospnm, hosp_manager_id, hosp_manager_name )
            values
        <foreach collection="list" item="item" separator=",">
            (
            #{item.hospid}, #{item.hospnm}, #{item.hospManagerId}, #{item.hospManagerName}
            )
        </foreach>
        ON DUPLICATE KEY UPDATE
        hospid =values(hospid),hospnm =values(hospnm), 
        hosp_manager_name =values(hosp_manager_name)
    </insert>

其中hosp_manager_id 为我创建的 UNIQUE

MyBatis中,`ON DUPLICATE KEY UPDATE` 是一种数据库操作语句,用于在尝试插入一个新记录时,如果因为主键或唯一索引冲突而失败,则会执行一个更新操作。这种SQL语句特别适用于当你希望在记录已存在时更新该记录,而不存在时则插入新记录的场景。 在MyBatis中,你可以通过XML映射文件或注解的方式来使用`ON DUPLICATE KEY UPDATE`。以下是使用XML映射文件的一个示例: ```xml <insert id="insertOrUpdate" useGeneratedKeys="true" keyProperty="id"> INSERT INTO your_table (column1, column2, ...) VALUES (#{param1}, #{param2}, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2) </insert> ``` 在这个例子中,`your_table`是你要插入或更新的表名,`column1`, `column2`等是你希望插入或更新的列名,`param1`, `param2`等是传递给映射方法的参数。当尝试插入一条记录时,如果`your_table`表中已存在具有相同主键或唯一索引值的记录,则会执行`ON DUPLICATE KEY UPDATE`后面的更新语句。 同样的逻辑也可以通过注解来实现,例如: ```java @Options(useGeneratedKeys = true, keyProperty = "id") @Insert("INSERT INTO your_table (column1, column2, ...) VALUES (#{param1}, #{param2}, ...)") @Update("UPDATE your_table SET column1 = #{param1}, column2 = #{param2}, ... WHERE id = #{id}") @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=int.class) public void insertOrUpdate(YourEntity entity); ``` 在这种方式下,当尝试插入数据时,如果出现重复键错误,MyBatis会自动根据`@Update`注解中定义的SQL语句来更新记录。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值