7、ON DUPLICATE KEY UPDATE实现插入更新操作
一、插入与更新操作:
MySQL中,采用ON DUPLICATE KEY UPDATE语句对不存在的数据进行INSERT插入操作,对已存在的数据进行UPDATE更新操作;
总结:
1、ON DUPLICATE KEY UPDATE语句根据主键或唯一键来判断当前插入是否已存在。
2、记录已存在时,只会更新ON DUPLICATE KEY UPDATE语句之后指定的字段。
3、如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
注:(uuid为主键,name为唯一索引)
CREATE TABLE `demo` ( `uuid` varchar(64) NOT NULL COMMENT '设备id', `name` varchar(255) NOT NULL COMMENT '主机名', `code` varchar(255) DEFAULT NULL COMMENT '设备用途', PRIMARY KEY (`uuid`) USING BTREE, UNIQUE KEY `name` (`name`) USING BTREE COMMENT '唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1、当INSERT语句存在主键或者唯一索引的列:
当INSERT语句存在主键或者唯一索引的列时,ON DUPLICATE KEY UPDATE语句根据主键ID或唯一索引来判断当前插入是否已存在,若已存在时,只会更新ON DUPLICATE KEY UPDATE之后限定的字段
(1)、INSERT中仅根据主键方式:
根据主键进行更新操作
INSERT INTO `demo`(`uuid`, `code`) VALUES ('1', '35')
ON DUPLICATE KEY UPDATE
`code` = VALUES(`code`)
(2)、INSERT中仅根据唯一索引方式:
根据唯一索引进行更新操作
INSERT INTO `demo`( `name`, `code`) VALUES ( '桌子', '80') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `code` = VALUES(`code`)
(3)、INSERT中主键存在相同,唯一索引不同:
根据主键进行更新操作
INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "2",'凳子', '50') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `code` = VALUES(`code`)
(4)、INSERT中唯一索引存在相同,主键不同:
即不插入也不更新(存在唯一键冲突)
2、当INSERT语句不存在主键或者唯一索引的列:
当INSERT语句不存在主键或者唯一索引的列时,仅执行插入操作
INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'裤子', '80') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `code` = VALUES(`code`)
3、ON DUPLICATE KEY UPDATE之后没有使用VALUES的情况:
(1)、`name` = `name`方式:
保持数据库原值,不进行更新操作
INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'衣服', '80') ON DUPLICATE KEY UPDATE `name` = `name`, `code` = VALUES(`code`)
(2)、`name` ="鞋子"方式:
INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'衣服', '80') ON DUPLICATE KEY UPDATE `name` = "鞋子", `code` = VALUES(`code`)
4、ON DUPLICATE KEY UPDATE与WHERE方式同时实现:
对设备进行更新操作时,有时需要判断某字段在满足某种情况才能执行更新
故可采用:
#方式一 INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'衣服', '50') ON DUPLICATE KEY UPDATE `name` = IF( `name` = "鞋子", "电器", `name` ), `code` = VALUES(`code`) #方式二 INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'衣服', '50') ON DUPLICATE KEY UPDATE `name` = IF( `code` = "80", "电器", `name` ), `code` = VALUES(`code`)
#name数据为null时进行更新 INSERT INTO `demo`( `uuid`,`name`, `code`) VALUES ( "3",'衣服', '50') ON DUPLICATE KEY UPDATE `name` = CASE WHEN `name` IS NULL THEN VALUES(`name`) ELSE `name` END, `code` = VALUES(`code`)
二、MySQL保留七天数据方式:
1、查询七天内数据:
SELECT * FROM table_info t where TO_DAYS(NOW())-TO_DAYS(t.create_time)<7;
2、删除七天外数据:
DELETE FROM table_info t where TO_DAYS(NOW())-TO_DAYS(t.create_time)>7;