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;

 

 

 

posted on 2022-08-11 11:47  爱文(Iven)  阅读(612)  评论(0编辑  收藏  举报

导航