1. 程式人生 > 其它 >Mysql 批量操作,存在更新,不存在插入

Mysql 批量操作,存在更新,不存在插入

技術標籤:databasemysql批量替換

需求場景

在大量資料插入,但是有很多重複資料。假設有如下資料表格

語法如下

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);
  1. 首先,我們需要定義一個unique key來避免重複鍵
  2. 在 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);

期待結果:

  1. 第一條資料被忽略
  2. 第二條資料更新第一條資料,modifier + modified
  3. 第三天資料執行insert

執行後結果如下:
在這裡插入圖片描述

注意

如果需要判斷是否為空,用IFNULL(),判斷傳入是否和預設值相同,用DEFAULT()函式