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   爱文(Iven)  阅读(655)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示

目录导航