情景说明:工作上遇到一个树形结构的数据,如有文件夹和子文件夹这样的数据。由于后端逻辑问题,导致在前端页面操作了删除功能后,数据库中仅部分数据被删除,比如只把根节点或是父节点删除了,没有级联删除所有子节点。然后实施那边的同事要求把数据再恢复回来,我找到运维的同事帮忙把前一天备份的数据给提取出来了,是一大堆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问题相关推荐

  1. insert into... where not exists插入避免重复的使用

    插入时为了方便,更是为了安全(避免查询==0? insert 这种方式),我们使用where not exists 下面代码: -- 创建测试表 create table testage( id in ...

  2. MySQL insert not exists插入唯一数据

    INSERT INTO table_name (id, name, age) SELECT * FROM (SELECT '1000', 'ndh', 32) AS tmp WHERE NOT EXI ...

  3. [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part I...

    一.提出问题 在开发一个企业级 应用的时候,尤其在一个涉及到敏感数据的应用,比如财务系统.物流系统,我们往往有这样的需求:对于数据库中每一笔数据的添加.修改和删除,都需要有一个明确的日志,以便我们可以 ...

  4. k8s概念入门之kube-proxy-针对早期(0.4)版本阅读

    k8s的kube-proxy分析 Kube-proxy主要是伴随着kubtlet进程一起部署在每个node节点中,proxy的功能主要就是为了完成在k8s集群中实现集群内部的通信,也可完成集群外的数据 ...

  5. 插入,在PostgreSQL中重复更新吗?

    本文翻译自:Insert, on duplicate update in PostgreSQL? Several months ago I learned from an answer on Stac ...

  6. SQL Server 触发器学习总结

    SQL菜鸟入门级教程之触发器 触发器简介:   触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...

  7. SQL Server中如何取得刚插入的标识值

    数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据.但我们平常得到的真的是我们需要的那个值么? 有时我们会使用 SELECT @@Identity 来获得我们刚刚插入的值,比如下 ...

  8. 如何使用SQL Server INSTEAD-OF触发器

    如何使用SQL Server INSTEAD-OF触发器 触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求.SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 ( ...

  9. sql语句的一些参考

    1.如何删除表中的重复记录?(这里指记录的每个字段都要相同) select  distinct  *  into  #temp  from  tab   delete  tab   insert  t ...

最新文章

  1. 最新!全球学术排名出炉:18所中国大学位居世界100强
  2. 【深度学习入门到精通系列】阿里云人工智能平台的使用方法
  3. nginx 认证多个客户端的问题
  4. termux配置python_termux python环境
  5. 七牛大数据平台的演进与大数据分析实践--转
  6. 干货 | 你真的了解 Convolutional Neural Networks 么
  7. ChannelFactory.Endpoint 上的地址属性为空。ChannelFactory 的终结点必须指定一个有效的地址。...
  8. Log4net数据表
  9. Oracle-13:Oracle中的表分区
  10. 用C语言实现解析简单配置文件的小工具
  11. 稀疏数组与二维数组相互转化
  12. 大多数项目能不能投资,能不能去创业,取决于自己是站在什么高度看问题
  13. 虚拟机环境下Centos6.5如何上网
  14. x-admin发异步把数据提交给php,role-add.html
  15. 现代男人养生的10点忠告
  16. 服务器互相备份不同步_94爱分享拍了拍你,这款好用的数据同步备份软件千万不要错过!...
  17. echarts地图随机点生成
  18. 智慧城市的顶层设计与底层对接
  19. ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程
  20. 微信服务号使用微信支付

热门文章

  1. C#静态(ststic)
  2. 详解基于MongoDB的地理位置查询,结合Symfony2演示
  3. 行为型模式:中介者模式 1
  4. Cocos2d-动作(Action)详解
  5. 01 注释的作用和分类
  6. Spark 的键值对(pair RDD)操作,Scala实现
  7. 2021为什么那么多人都在做亚马逊测评?2022年还能做吗?
  8. 锐捷ac怎么发现局域网ap_锐捷 ac ap 连接 记录
  9. Linux系统如何安装?
  10. 判断键盘输入的数是几位数且是否是回文数