1. 程式人生 > 其它 >INSERT ON DUPLICATE KEY UPDATE IF語句帶條件更新

INSERT ON DUPLICATE KEY UPDATE IF語句帶條件更新

INSERT ON DUPLICATE KEY UPDATE IF語句帶條件更新插入

本文地址:https://www.cnblogs.com/muphy/p/16291503.html

使用說明

  1. 資料庫不存在主鍵則直接插入,否則更新
  2. 使用ON DUPLICATE KEY UPDATE必須要有唯一主鍵/約束
  3. 對應的語句還有replace into但是效率不高
  4. 取值說明,如“col_name=col_name_1 + values(col_name)”,表示:col_name列的值=資料庫中col_name_1列的值+當前插入col_name列的值
  5. if語句,如“col_name=if(condition, true_value, else_value)”,表示condition條件成立時,取true_value值來更新,否則取else_value值來更新
  6. 組合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中批量更新使用請看下一篇介紹