INSERT ON DUPLICATE KEY UPDATE IF语句带条件更新插入
本文地址:https://www.cnblogs.com/muphy/p/16291503.html
使用说明
- 数据库不存在主键则直接插入,否则更新
- 使用ON DUPLICATE KEY UPDATE必须要有唯一主键/约束
- 对应的语句还有replace into但是效率不高
- 取值说明,如“col_name=col_name_1 + values(col_name)”,表示:col_name列的值=数据库中col_name_1列的值+当前插入col_name列的值
- if语句,如“col_name=if(condition, true_value, else_value)”,表示condition条件成立时,取true_value值来更新,否则取else_value值来更新
- 组合4、5可以完成大部分功能
准备数据
CREATE TABLE `test_1` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`dept_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '部门id',
`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户id',
`sort` int DEFAULT 0 COMMENT '排序',
`count` int DEFAULT 0 COMMENT '次数',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试';
INSERT INTO test_1(`id`, `dept_id`, `user_id`,`sort`,`count`,`remark`) VALUES (1, 'd1', 'u1', 1, 0, 'b1');
INSERT INTO test_1(`id`, `dept_id`, `user_id`,`sort`,`count`,`remark`) VALUES (2, 'd2', 'u2', 2, 0, 'b1');
![]()
更新和插入
insert into test_1 (id,dept_id,user_id,`sort`,`count`,`remark`)
values (1,'d1-1','u1-1',1,0,'b1-1'),(2,'d2-2','u2-2',2,0,'b2-2'),(3,'d2-3','u2-3',3,0,'b3-3')
ON DUPLICATE KEY UPDATE
-- 原字段dept_id的值为'd1',就设置成当前需要插入dept_id的值和原字段dept_id的值拼接起来,否则使用当前插入值更新
id=(id),dept_id=if(dept_id = 'd1', CONCAT(dept_id,'-',values(dept_id)), values(dept_id)),
-- 当前插入user_id的值为'u1-1'就不更新,否则使用当前插入值
user_id=if(values(user_id) = 'u1-1', user_id, values(user_id)),
-- 存在时不更新,和不写效果一样
sort=(sort),
-- 存在时将原来的值+1
count=count + 1,
-- 存在时使用插入值remark更新
remark=values(remark)
![]()
mysql中批量更新使用请看下一篇介绍