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

时间:2022-08-23 15:14:22


个人实例:

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表结构如下 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

1、replace语法
    select * from test;

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

2、ignore 
这里我们应用insert ignore执行插入(1,’xiaoplan’),运行成功,但是数据没有插入到test表中。 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法 
insert ignore 和update联合使用(发现主键为’1’的’xiaohong’被更新为’xiaolan’) 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法 
运行结果图 
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’ 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法 
直接上代码

    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

执行存储过程后结果截图(各位可以尝试建表操作),功能实现 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

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插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
插入不同数据,如果主键不同,则插入 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法 
看一下主键相同情况是否可以更新多列,(可以执行) 
mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

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&colon; 无法验证 &lpar;DENGCHAO&period;TEST&rpar; - 违反主键

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

随机推荐

  1. jshint创建配置文件

    在项目中创建文件,并必须以 .jshintrc 命名: 例如 {    "eqeqeq":true,     "curly":true}

  2. java攻城狮之路&lpar;Android篇&rpar;--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...

  3. 如何:从代码创建 UML 类图&lpar;ZZ&rpar;

      您拖动的一个或多个类将显示在关系图上. 它们依赖的类将显示在"UML 模型资源管理器"中. 参见 模型表示类型的方式. 将程序代码中的类添加到 UML 模型 打开一个 C# 项 ...

  4. EXT--当defaultType与items的子组件默认xtype冲突时items的子组件的xtype为panel

    示例图 直接看下面示例代码: /** * 获取导入表单 * @returns {Ext.FormPanel} */ function getImportForm() { return new Ext. ...

  5. VS2012启用SQLite的Data Provider

    VS 2012默认是不带的SQLite的Data Provider,所以无法直接在VS 2012里管理SQLite的数据库,自然也不能在VS里像SQL Server那样直接生成Entity Frame ...

  6. &lpar;Problem 39&rpar;Integer right triangles

    If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact ...

  7. ajax介绍及使用

    一.什么是ajax:(只刷新局部页面的技术) AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发 ...

  8. 16&period;监听器-基础&period;md

    目录 概念 监听器功能 监听创建或销毁 监听属性变化 session相关监听 概念 实现特定接口的普通java类 *监听特定对象的创建.销毁或属性变化: 对象自己创建自己用:无需监听 对象别人创建自己 ...

  9. Ajax常见面试题 -- 前端面试题(二)

    1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互   2:原生js ajax请求有几个步骤?分别是什么 ...

  10. 基于 ARM的 Windows 10S 笔记本 转帖

    首款骁龙笔记本华硕畅370评测:续航不俗 性能拖后腿 2018年06月21日 12:23 新浪数码 缩小字体放大字体收藏微博微信分享   相关阅读:国内首款骁龙本华硕畅370发布:6199元送一年无限 ...