mysql 对于数据已经存在的,则更新。否则新增 duplicate的使用
业务场景
对于数据已经存在的,则更新;否则新增。通过主键或唯一索引来判断
当前有一个仪器录入的功能,每天可以多次录入,但是一个仪器一天只有一条最终记录。
创建一个信息表(设置仪器编号和时间为主键)
还有另一个场景 对于主键已经存在的,则删除重复的那行数据,然后在插入一行;id会变。
此时用replace into
不同之处:
一、REPLACE 步骤是删除旧数据,插入新数据,之前的递增自动编号不存在,会AUTO_INCREMENT一个新的自动编号,因此会刷新索引。
二、DUPLICATE 不会改变旧的递增自动编号,同样会保持旧的索引不变。
==此篇使用DUPLICATE ==
CREATE TABLE `device_info` (
`ID` varchar(36) NOT NULL COMMENT '唯一标示',
`DEVCODE` varchar(50) NOT NULL COMMENT '仪器编号',
`DEVNAME` varchar(100) NOT NULL COMMENT '仪器名称',
`DEVTYPE` varchar(50) NOT NULL COMMENT '仪器类型',,
`FACTORY` varchar(100) DEFAULT NULL COMMENT '代理厂商',
`ADDRESS` varchar(150) DEFAULT NULL COMMENT '地址',
`CONTPHONE` varchar(20) DEFAULT NULL COMMENT '联系电话',
`DATEDATE` datetime NOT NULL,
PRIMARY KEY (`DEVCODE`,`DATEDATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='仪器信息表';
使用duplicate
注意主键是用来判断的,所以不在duplicate key update后面更新
INSERT INTO device_info(
ID,
DEVCODE,
DEVNAME,
DEVTYPE,
FACTORY,
ADDRESS,
CONTPHONE,
DATEDATE
)
VALUES
(#{deviceInfo.ID},#{deviceInfo.DEVCODE},
#{deviceInfo.DEVNAME},#{deviceInfo.DEVTYPE},
#{deviceInfo.FACTORY},#{deviceInfo.ADDRESS},
#{deviceInfo.CONTPHONE}, #{deviceInfo.DATEDATE})
on duplicate key update ID=values(ID), DEVNAME=values(DEVNAME),
DEVTYPE=values(DEVTYPE),FACTORY=values(FACTORY), ADDRESS=values(ADDRESS),
CONTPHONE=values(CONTPHONE), DATEDATE=values(DATEDATE);