INSERT ON DUPLICATE KEY UPDATE IF語句帶條件更新
阿新 • • 發佈:2022-05-20
INSERT ON DUPLICATE KEY UPDATE IF語句帶條件更新插入
使用說明
- 資料庫不存在主鍵則直接插入,否則更新
- 使用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)