11、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`)

二、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;
搜索
复制
11、ON DUPLICATE KEY UPDATE实现插入更新操作的更多相关文章
- ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...
- ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- mysql ON DUPLICATE KEY UPDATE重复插入时更新
mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...
- MySQL on duplicate key update 批量插入并更新已存在数据
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...
- mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into
转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用 mysql insert时几个操作DE ...
- mysql insert on duplicate key, update, ignore
insert 语句中不能使用where,所以如果需要根据插入的数据在已有的数据库表是否重复做一些操作可以使用下面三种方法: 1. 使用insert,捕获duplicate错误 2. insert in ...
- mysql ON DUPLICATE KEY UPDATE、REPLACE INTO
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...
- MySQL_插入更新 ON DUPLICATE KEY UPDATE
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...
- mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE
有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, ...
- MYSQL主键存在则更新,不存在则插入的解决方案(ON DUPLICATE KEY UPDATE)
经常我们使用的最简单的数据库操作就是数据的更新,删除和插入,对于批量删除和插入的方法相信大家都很清楚,那么批量更新估计有的人就不知道了,并且还有批量插入,在插入时若有主键冲突则更新的操作,这在EAV模 ...
随机推荐
- POJ1681 Painter's Problem(高斯消元)
题目看似与线性方程组无关,但可以通过建模转化为线性方程组的问题. 对于一块砖,刷两次是没有必要的,我们令x=1表示刷了一次,x=0没有刷,一共有n*n个,所以相当于有n*n个未知量x. 定义aij表示 ...
- 关于history.back()、history.go()回退但无法刷新页面的问题
window.history.back(); 这样确实可以做到后退的功能,但是项目中,常常并不只是后退就能完成需求,往往需要在后退的同时,刷新后退的页面信息,比如后退到首页同时刷新首页的最新数据,这样 ...
- Pytest进阶使用
fixture 特点: 命令灵活:对于setup,teardown可以省略 数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入,可以跨文件共享 scope的层次及神 ...
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
前言 这是2016年的一个洞,利用条件是至少知道一个触发 springboot 默认错误页面的接口及参数名. 影响版本:1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升级版本 ...
- Vue学习之--------组件嵌套以及VueComponent的讲解(代码实现)(2022/7/23)
欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...
- python同时识别多张人脸(运用face_recognition)
之前发的博客和网上流传的代码严格来说都只算得上是人脸检测,不能区别人脸,今天来说说真的人脸识别 篇幅所限,就举两张人脸的例子了,本程序需要安装face_recognition 下面是全部源代码: im ...
- ssh登录提示hosts is down
其他无用的网卡配置信息mv走重启network如果还是不行重启一下服务器问题就能解决
- Java Timer使用介绍
java.util包下提供了对定时任务的支持,涉及2个类: Timer:定时器类 TimerTask:任务抽象类 使用该定时任务我们需要继承TimerTask抽象类,覆盖run方法编写任务执行代码,并 ...
- CSP-J/S 2021 游记
\(\large\texttt{Day -1}\) 晚上好累啊,去集训了,回来之后发现十一点了还码了一会儿,只能祈求上帝明天不会打瞌睡. \(\large\texttt{Day 0}\) 意料中的事情 ...
- 优秀的Kafka GUI客户端、可视化管理工具、监控工具
想要查看Topic里的消息却找不到软件,想要查看或更新Broker.Topic配置,想要监控Broker服务器状态?试试下面的Kafka GUI工具--Kafka Assistant 官网地址:htt ...