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

个人实例:

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:标志定义错误的名称

这边我们要实现插入时如果主键重复则更新,主键不重复则插入的效果,所以我们要先了解主键重复的异常是什么,然后抓捕异常,将异常处理类型定义为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一条记录后 返回创建记录主键id的方法

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

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

一.查询表主键. describe indexes for table . 例: describe indexes for t ...

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

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

为 mysql 数据表添加主键

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

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

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

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

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

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

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

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

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

Oracle表添加主键、外键

1.创建表的同时创建主键约束 (1)无命名 create table student ( studentid int primary key not null, studentname varchar ...

随机推荐

MLA Handbook for Writers of Research Papers笔记

MLA Handbook for Writers of Research Papers.7th ed.New York:MLA,2009.print.还有一本,留待阅读MLA Style Manual ...

[置顶] 玩转Eclipse — 自动注释插件JAutodoc

代码注释是一种良好的编程习惯.不管对于他人还是自己,注释都有助于代码的阅读和理解.手动添加注释,是一个非常费时和繁琐的工作,严重影响软件开发效率,这也是绝大多数程序员不愿添加注释的主要原因.JAuto ...

HDU 2665(Kth number-区间第k大[内存限制+重数])

Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

【电视桌面CSWUI】电视桌面(launcher)截图欣赏

网络播放器是最重要的电视桌面.cswui,我们公司做了一个非常大的人力,物力搞一个电视柜.后来一一介绍,简言之发送屏幕截图.给大家看. watermark/2/text/aHR0cDovL2Jsb2c ...

Python3 数字(Number)

Python 解释器可以作为一个简单的计算器:您可以在解释器里输入一个表达式,它将输出表达式的值. 表达式的语法很直白: +, -, * 和/ 和在许多其它语言(如Pascal或C)里一样:括号可以用 ...

jdbcTemplate的简单介绍

Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTempl ...

VsCode插件开发之入门示例

主要参考官网:https://code.visualstudio.com/api/get-started/your-first-extension 其实也就三步 一.安装环境 npm install ...

linux下模拟一个木马程序运行过程

预备知识: 将一个程序放入到后台,悄悄的执行 ./xxx.sh & 进程: 用户进程:由用户来管理 系统进程:由系统内核自行管理 系统中的每个进程,都有一个位置的ID,这就是pid,而且每次启 ...

swift 计算100000以内的 回文数

... { var rep = var aa = a repeat{ rep = rep * + aa % aa = aa / }) if(rep == a) { print("\(a)是回 ...

论坛:设计实体-->分析功能-->实现功能 之 《分析功能》

其中 管理文章 的功能没有做,以下做的设计 浏览与参与 功能的步骤 分析功能   5个功能.   7个请求. 实现功能   Action, 7个方法   Service   Dao   Jsp For ...


版权声明:本文为weixin_32158567原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。