个人实例:

INSERT INTO w_dashboard(dashboard_name, content, createTime)
VALUES("aa","cc","2018-01-11 16:58:03")
ON DUPLICATE KEY UPDATE dashboard_name=VALUES(dashboard_name);

INSERT IGNORE INTO w_dashboard(dashboard_name, content, createTime) 
VALUES("aa","cc","2018-01-11 16:58:03");



1、replace语句:替换已有的行 replace语句是insert语句的一个变种 当添加新行时 1)如果主键值重复,那么覆盖表中已有的行 2)如果没有主键值重复,则插入该行 2、ignore insert语句可以使用ignore选项来当insert语句出现错误时,不显示错误信息,但是insert语句不执行。 insert ignore into 。。。。。 3、可以采用异常抓捕的方式来实现handler,相当于sqlserver中的try catch 4、如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值, 则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。

四个方法分步解析: 
操作表test表结构如下 

1、replace语法
    select * from test;

 
现在插入(1,’xiaohong’)数据,发现出现错误,错误提示(主键重复输入’1’),证明当insert插入相同主键时是会报错的。 
 
现在我们来replace语句测试一下会不会不报错,执行成功 
 
查询一下我们的表信息,发现之前的记录(1,’xiaozhang’)已经被替换成(1,’xiaohong’), 
证明我们插入相同的主键信息,replace会替换原有信息。 
 
replace语法执行和数据库中主键重复的数据会替换原有信息,那么执行不同的信息会有怎么样的操作呢?(发现执行和数据库中没有主键重复的数据,则执行插入操作) 

2、ignore 
这里我们应用insert ignore执行插入(1,’xiaoplan’),运行成功,但是数据没有插入到test表中。 
 
 
insert ignore 和update联合使用(发现主键为’1’的’xiaohong’被更新为’xiaolan’) 
 
运行结果图 
3、可以采用异常抓捕的方式来实现handler,相当于sqlserver中的try catch 
handler是mysql的自定义异常处理。

        定义异常处理语法
        DECLARE handler_type HANDLER FOR condition_value sp_statement
        语法解析
        handler_type:为异常的处理方式,也就是当发生异常时怎么处理,有三个参数
            1)exit ,表示遇到异常马上退出
            2)continue ,表示遇到异常不处理,继续执行sql代码
            3)undo ,mysql不支持,是一个回滚操作
        condition_value:表示错误类型
            1)SQLSTATE [VALUE] sqlstate_value  为包含5个字符的字符串错误值
            2)SQLWARNING  匹配所有以01开头的SQLSTATE错误代码
            3)NOT FOUND  匹配所有以02开头的SQLSTATE错误代码
            4)SQLEXCEPTION  匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码
            5)mysql_error_code  匹配数值类型错误代码
        condition_name:标志定义错误的名称

异常定义引用:https://www.2cto.com/database/201410/341132.html想深入了解可以查看

这边我们要实现插入时如果主键重复则更新,主键不重复则插入的效果,所以我们要先了解主键重复的异常是什么,然后抓捕异常,将异常处理类型定义为continue,然后执行我们的update操作 
先找出主键重复错误的异常编号,标号为’1062’ 
 
直接上代码

    drop procedure if exists test;
    create procedure test()         #创建存储过程
    BEGIN
    DECLARE done INT default 0 ;  #定义变量

        #定义主键重复异常发生时将done赋值为1;同时异常的处理方式是continue,异常发生继续执行
        DECLARE CONTINUE HANDLER for 1062 SET done=1;  

        #执行插入操作,插入过程中可能发生主键重复,如果主键重复那么done被赋值为1
        insert into test(id,name) values(1,'xiaowang'); 

        #如果done的值为1的话,实现更新原有数据
        if done = 1 then
            update test set name='xiaowang' where id=1;
        end if;
    END

执行存储过程后结果截图(各位可以尝试建表操作),功能实现 

4、如果在insert语句末尾指定了on duplicate key update

insert into test(id,name) values(1,'如来') on duplicate key update name=values(name);      #on duplicate key update 后面加入如果主键重复更新的列和更新的值,这里面更新test表的name列,更新的值是values('如来'),但是要写成values(name).

运行截图,实现将已有数据更新的效果 

插入不同数据,如果主键不同,则插入 
 
看一下主键相同情况是否可以更新多列,(可以执行) 

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法的更多相关文章

  1. cassandra表中主键的类型

    cassandra表中主键的类型及区分? 一.类型及区分 二.参考文章 一.类型及区分 Cassandra的4种Key Primary Key 主键 Composite Key,Compound Ke ...

  2. mysql insert一条记录后 返回创建记录主键id的方法

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  3. 查询/删除/建立DB2数据表的主键

    一.查询表主键. describe indexes for table <instancename>.<tablename> 例: describe indexes for t ...

  4. oracle查询A表中主键都被哪些表引用了?

    select r.TABLE_NAME from USER_CONSTRAINTS p, USER_CONSTRAINTS r where p.TABLE_NAME = 'IAM_AUDIT_FIND ...

  5. 为 mysql 数据表添加主键

    DROP TABLE IF EXISTS `sdo_actData`.`actCDKey`; CREATE TABLE `sdo_actData`.`actCDKey` ( `RoleID` ) ' ...

  6. 为一个有数据没有主键id的数据表添加主键字段

    ALTER TABLE `photo_feedbacks` ADD COLUMN `id`  int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KE ...

  7. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

  8. 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类

    http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...

  9. 给表追加主键-----报错ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键

    由于 这次 项目 做了 数据库 迁移(从 mysql 转到oracle  用的是navicat) 的工具  所以导致很多主键都丢失了 导致数据库很多 数据的id重复  导致系统修改一条数据的时候 出现 ...

随机推荐

  1. Delphi Web开发连载 --ThinkDelphi (序)

    如果把Delphi比作男人,那他曾经独步天下,笑傲江湖过: 如果把Delphi比作女子,那她曾经貌美如花,倾国倾城过! 但那只是历史,那只是曾经, 弹指一挥间,Delphi却似乎英雄迟暮,美人已老.. ...

  2. CSS属性操作

    CSS属性操作 1 属性选择器 Elenment(元素) E[att] 匹配所有具有att属性的E元素,不考虑它的值.(注意:E在此处可以省略)(推荐使用) 例如:[po]{ font-size: 5 ...

  3. Java-NIO(八):DatagramChannel

    Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤: 1)打开 DatagramChannel 2)接收/发送数据 同样它也支持NIO的非阻塞模式操作,例如: @T ...

  4. POJ-1328 Radar Installation--区间选点问题(贪心)

    题目链接: https://vjudge.net/problem/POJ-1328 题目大意: 假设陆地的海岸线是一条无限延长的直线,海岛是一个个的点,现需要在海岸线上安装雷达,使整个雷达系统能够覆盖 ...

  5. 01、NetCore2.0优化之Web服务器 与 IIS解耦

    01.NetCore2.0优化之Web服务器 与 IIS解耦 在Asp.Net Core 2.0中,是如何实现跨平台的?不使用IIS了,在linux上的WebServer是什么? ---------- ...

  6. 正则-匹配IP地址

    >>> re.search(r'[aeiouAEIOU]','I love FishC.com!') 中括号里面的任意一个字符匹配成功就会返回数值 <_sre.SRE_Matc ...

  7. Ubuntu16.04系统下 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)、无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”的方法

    在Ubuntu16.04下安装软件,例如:sudo apt-get install lrzsz时提示: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) 无法 ...

  8. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

    一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...

  9. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  10. Web SCADA 电力接线图工控组态编辑器

    前言 SVG并非仅仅是一种图像格式, 由于它是一种基于XML的语言,也就意味着它继承了XML的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如SVG可以内嵌于其他的XML文档中,而SVG文档中 ...