Mysql 批量操作,存在更新,不存在插入
阿新 • • 發佈:2020-12-17
需求場景
在大量資料插入,但是有很多重複資料。假設有如下資料表格
語法如下
INSERT INTO `table_name` (clo1,col2,...)
VALUES
(val1-1,val1-2,...),
(val2-1,val2-2,...),
(val3-1,val3-2,...),
ON DUPLICATE KEY UPDATE
clo1= VALUES(clo1),
clo2= VALUES(clo2);
- 首先,我們需要定義一個unique key來避免重複鍵
- 在 ON DUPLICATE KEY UPDATE(重複更新)的操作的時候,採用了values()方法來更新資料
案例
CREATE TABLE `bt_product_synchronize_index` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '記錄編號', `company_id` int(20) NOT NULL COMMENT '企業編號', `product_id` varchar(50) DEFAULT '' COMMENT '商品編號', `code` varchar(255) NOT NULL COMMENT '貨號', `type` tinyint(4) NOT NULL COMMENT '更新型別 1:商品 2:渠道商品', `operate_type` tinyint(4) DEFAULT NULL COMMENT '操作方式 1:新增 2:修改 3:刪除', `creater` varchar(100) NOT NULL COMMENT '建立者', `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '建立者', `modifier` varchar(100) NOT NULL COMMENT '修改者', `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', PRIMARY KEY (`id`), UNIQUE KEY `idx_company_code_type` (`company_id`,`code`,`type`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2712 DEFAULT CHARSET=utf8 COMMENT='商品同步索引對列表';
注意,唯一鍵
UNIQUE KEY `idx_company_code_type` (`company_id`,`code`,`type`) USING BTREE
我們需要批量插入資料,但是如果有的話,那麼就更新modified + modifier,現有資料如下:
執行如下指令碼:
INSERT INTO `bt_product_synchronize_index`(`company_id`, `product_id`, `code`, `type`, `operate_type`, `creater`, `created`, `modifier`, `modified`) VALUES (10124, 'pid-00101','1012412145873543323035', 1, 1, '', NOW(), 'updater1', NOW()), (10124, 'pid-00101','1012412145873543323035', 1, 1, '', NOW(), 'updater2', NOW()), (10124, 'pid-008', 'code-008',1, 1,'inserter', NOW(), 'inserter', NOW()) ON DUPLICATE KEY UPDATE modifier = VALUES(modifier), product_id = VALUES(product_id), modified = VALUES(modified), operate_type = VALUES(operate_type);
期待結果:
- 第一條資料被忽略
- 第二條資料更新第一條資料,modifier + modified
- 第三天資料執行insert
執行後結果如下:
注意
如果需要判斷是否為空,用IFNULL(),判斷傳入是否和預設值相同,用DEFAULT()函式