插入一条数据,存在则不操作,不存在就插入(必须现有唯一键)
使用insert ignore语句,例如插入数据:
insert ignore into user_info (last_name,first_name) values ('LeBron','James');
这样一来,如果表中已经存在last_name='LeBron'且first_name='James'的数据,就不会插入,如果没有就会插入一条新数据。
上面的是一种用法,也可以用 INSERT .... SELECT 来实现。
插入一条数据,存在就更新,不存在就插入(必须现有唯一键)
a、INSERT...ON DUPLICATE KEY UPDATE的使用
如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则会更新ON DUPLICATE KEY UPDATE关键字后面的字段值。
例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
在mybatis中使用(在update标签下),会更新ON DUPLICATE KEY UPDATE关键字后面的字段值
如果数据存在的话就会触发条件 ON DUPLICATE KEY UPDATE ,从而更新字段 statistics_json=values(statistics_json), update_time=now()
<update id=“b">
insert INTO table_name
(product_id,departs_date,price_value,)
VALUES
<foreach collection="list" index="index" item="item"separator=",">
(#{item.productId},#{item.departsDate},#{item.priceValue}
</foreach>
<!--存在即可修改下述字段的数据,注意values()中的内容是数据表中相应的字段名-->
ON DUPLICATE KEY UPDATE
price_type = VALUES(price_type),
price_value = VALUES(price_value)
</update>
b、REPLACE关键字的使用
语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。
REPLACE INTO users (id,name,age) VALUES(123, '贾斯丁比伯', 22);
在mybatis中使用(在insert标签下)
<insert id="saveOpenTime">
REPLACE INTO opentime
(weekday, time_start, time_end, start_cron_expr, end_cron_expr)
VALUES (#{weekday}, #{timeStart}, #{timeEnd}, #{startCronExpr}, #{endCronExpr})
</insert>
如果主键重复会先删除数据库中原来的记录,插入新纪录。但是数据库删除操作需要维护主键索引,这无疑需要消耗性能。
ON DUPLICATE KET QPDATE只是在主键重复时修改所需字段的值,所以不影响主键。维护成本自然相对于replace低。
参考:
https://blog.csdn.net/CNAHYZ/article/details/88786117
https://segmentfault.com/q/1010000019851014?utm_source=tag-newest