INSERT INTO IF NOT EXISTS问题
情景说明:工作上遇到一个树形结构的数据,如有文件夹和子文件夹这样的数据。由于后端逻辑问题,导致在前端页面操作了删除功能后,数据库中仅部分数据被删除,比如只把根节点或是父节点删除了,没有级联删除所有子节点。然后实施那边的同事要求把数据再恢复回来,我找到运维的同事帮忙把前一天备份的数据给提取出来了,是一大堆
insert into
的语句,按理说我只要把被删掉的那几条数据插进去即可。
问题主要就是如何找出这几条数据来,有这么两种思路:
1.先把这一堆insert语句插到另一个表中,然后与业务表关联查询,找出被删除的列,然后单独复制出insert这几行数据的语句
2.修改这一堆insert语句,详见mysql insert if exists_mysql数据库中的insert if not exists
上面提到的两种方法都是可以的,只是稍微有一点点费力,我找到了如下的方式
ON DUPLICATE KEY UPDATE
insert into users values(1,"张三","123") ON DUPLICATE KEY UPDATE id = id;
ON
之前的内容为运维给过来的插入语句,其后的内容为新加上来的。意思是如果该行数据插入时报DUPLICATE
的错的话,就把该行ID的值更新为原来ID的值,也就是不更新,执行后也可以看到影响行数是0。这样相当于啥也没做,但是不报错了,也就实现了我的需求,已存在的插入语句啥也不做,也不报错。
这种方式的话,只需要在运维给过来的每一行INSERT
语句的末尾添加上ON DUPLICATE KEY UPDATE id = id
即可。如下,只需要正则替换一下就可以了
IGNORE
INSERT IGNORE INTO t (i) VALUES(1),(1)
这个ignore
会忽略所有ignorable的错误,然后产生warnings信息
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t (i) VALUES('abc');
Query OK, 1 row affected, 1 warning (0.01 sec)mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: 'abc' for column 'i' at row 1 |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)
应该也是可以实现这种需求的。
参考官方文档:
页面最下端:https://dev.mysql.com/doc/refman/5.7/en/insert.html
有使用示例的:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#ignore-effect-on-execution
INSERT INTO IF NOT EXISTS问题相关推荐
- insert into... where not exists插入避免重复的使用
插入时为了方便,更是为了安全(避免查询==0? insert 这种方式),我们使用where not exists 下面代码: -- 创建测试表 create table testage( id in ...
- MySQL insert not exists插入唯一数据
INSERT INTO table_name (id, name, age) SELECT * FROM (SELECT '1000', 'ndh', 32) AS tmp WHERE NOT EXI ...
- [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part I...
一.提出问题 在开发一个企业级 应用的时候,尤其在一个涉及到敏感数据的应用,比如财务系统.物流系统,我们往往有这样的需求:对于数据库中每一笔数据的添加.修改和删除,都需要有一个明确的日志,以便我们可以 ...
- k8s概念入门之kube-proxy-针对早期(0.4)版本阅读
k8s的kube-proxy分析 Kube-proxy主要是伴随着kubtlet进程一起部署在每个node节点中,proxy的功能主要就是为了完成在k8s集群中实现集群内部的通信,也可完成集群外的数据 ...
- 插入,在PostgreSQL中重复更新吗?
本文翻译自:Insert, on duplicate update in PostgreSQL? Several months ago I learned from an answer on Stac ...
- SQL Server 触发器学习总结
SQL菜鸟入门级教程之触发器 触发器简介: 触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...
- SQL Server中如何取得刚插入的标识值
数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据.但我们平常得到的真的是我们需要的那个值么? 有时我们会使用 SELECT @@Identity 来获得我们刚刚插入的值,比如下 ...
- 如何使用SQL Server INSTEAD-OF触发器
如何使用SQL Server INSTEAD-OF触发器 触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求.SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 ( ...
- sql语句的一些参考
1.如何删除表中的重复记录?(这里指记录的每个字段都要相同) select distinct * into #temp from tab delete tab insert t ...
最新文章
- 最新!全球学术排名出炉:18所中国大学位居世界100强
- 【深度学习入门到精通系列】阿里云人工智能平台的使用方法
- nginx 认证多个客户端的问题
- termux配置python_termux python环境
- 七牛大数据平台的演进与大数据分析实践--转
- 干货 | 你真的了解 Convolutional Neural Networks 么
- ChannelFactory.Endpoint 上的地址属性为空。ChannelFactory 的终结点必须指定一个有效的地址。...
- Log4net数据表
- Oracle-13:Oracle中的表分区
- 用C语言实现解析简单配置文件的小工具
- 稀疏数组与二维数组相互转化
- 大多数项目能不能投资,能不能去创业,取决于自己是站在什么高度看问题
- 虚拟机环境下Centos6.5如何上网
- x-admin发异步把数据提交给php,role-add.html
- 现代男人养生的10点忠告
- 服务器互相备份不同步_94爱分享拍了拍你,这款好用的数据同步备份软件千万不要错过!...
- echarts地图随机点生成
- 智慧城市的顶层设计与底层对接
- ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程
- 微信服务号使用微信支付