Mysql的ON DUPLICATE KEY UPDATE使用

992 阅读1分钟

mysql存在插入,不存在更新操作 insert into table_name (key1,key2,key3)VALUEs(?,?,?) ON DUPLICATE KEY UPDATE key1 = VALUES(value1),key2=VALUES(value2),updatetime = CURRENT_TIMESTAMP;

对比直接插入 inert into table_name(key1,key2,key3)VALUES(?,?,?)

多了ON DUPLICATE KEY UPDATE key1=VALUES(value1); 建立数据表的时候需要用关键字UNIQUE指定唯一字段,

比如设置id_only为唯一字段

CREATE TABLE `get_query_shop` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `shopId` varchar(100) DEFAULT NULL COMMENT '店铺Id',
  `cid1Name` varchar(100) DEFAULT NULL COMMENT '一级类目名称',
  `cid2Name` varchar(1000) DEFAULT NULL COMMENT '二级类目名称',
  `id_only` varchar(100) DEFAULT NULL COMMENT '标记唯一订单行:',
  `orderTime` varchar(100) DEFAULT NULL COMMENT '下单时间',

  `createtime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',
  `updatetime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_only` (`id_only`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

需要更新那些字段就添加在ON DUPLICATE KEY UPDATE后面,可以更新一个或多个字段 例如更新orderTime和cid1Name:

insert into get_query_shop (shopId,cid1Name,cid2Name,id_only,orderTime)VALUEs
("10010","1","1-2","a","20210202") ON DUPLICATE KEY UPDATE orderTime = 
VALUES("20210202"),cid1Name=VALUES("1-2"),updatetime = CURRENT_TIMESTAMP;

需要注意的是:这种插入法,数据的ID字段不会连续,并且直接inster插入会出错,因为有唯一字段,一旦出现重复数据将无法插入

如果建表的时候忘记设置,或者设置错误,可以在后续继续修改和添加

添加唯一字段:可以是多个,将上表shopId设置为唯一字段 
ALTER TABLE get_query_shop ADD unique(`shopId)
删除唯一字段id_only(只是删除唯一字段,字段还保留在数据表)
alter table get_query_pdd drop index `id_only`;