mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
- 【CSDN下载】 Powerdesigner 设计主键code不能重复等问题
- 【CSDN博客】 Oracle中用一个序列给两个表创建主键自增功能的后果
- 【CSDN博客】 MySQL自增主键删除后重复问题
- 【CSDN博客】 mysql 主从复制 双主从复制原理 防止主键重复问题(必看)
- 【CSDN博客】 replace into导致mysql自增列导致主键重复问题分析
- 【CSDN博客】 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql)
- 【CSDN博客】 mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
- 【CSDN博客】 测试以两个外键为复合主键的表,两个外键空值情况
- 【CSDN博客】 mysql 忽略主键冲突、避免重复插入的几种方式
- 【CSDN博客】 mysql 忽略主键冲突、避免重复插入的几种方式
- 【CSDN博客】 sqlserver中多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表
- 【CSDN博客】 MySQL自增主键删除后插入新记录主键重复问题
个人实例:
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插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法的更多相关文章
- cassandra表中主键的类型
cassandra表中主键的类型及区分? 一.类型及区分 二.参考文章 一.类型及区分 Cassandra的4种Key Primary Key 主键 Composite Key,Compound Ke ...
- mysql insert一条记录后 返回创建记录主键id的方法
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- 查询/删除/建立DB2数据表的主键
一.查询表主键. describe indexes for table <instancename>.<tablename> 例: 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重复 导致系统修改一条数据的时候 出现 ...
随机推荐
- Mego开发文档 - 保存关系数据
保存关系数据 由于没有对象的更改跟踪,因此关系的操作需要开发者明确指定,在成功执行后Mego会影响到相应的关系属性中. 添加关系 在以下示例中如果成功执行则source的Customer属性会变为ta ...
- Python之Scrapy爬虫框架 入门实例(一)
一.开发环境 1.安装 scrapy 2.安装 python2.7 3.安装编辑器 PyCharm 二.创建scrapy项目pachong 1.在命令行输入命令:scrapy startproject ...
- 云计算 IaaS,SaaS,PaaS的区别?一个通俗易懂的吃货文章
来自一篇吃货文章了: ———————————————————— <img src="https://pic2.zhimg.com/a55676f8e1b084a398f8cd5 ...
- SpringMVC(七):@RequestMapping下使用POJO对象绑定请求参数值
Spring MVC会按照请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性. 如:address.city.dept.address.province等. 步骤一:定义Ac ...
- [转]scrapy中的logging
logging模块是Python提供的自己的程序日志记录模块. 在大型软件使用过程中,出现的错误有时候很难进行重现,因此需要通过分析日志来确认错误位置,这也是写程序时要使用日志的最重要的原因. scr ...
- git checkout+文件丢失
坑:不知什么时候, 应该是初学git的时候, 在桌面git init了一下, 这次忘记切目录直接在桌面git checkout了, 导致文件丢失了. 解决: 简单复原: git reflog # 查看 ...
- 在 .NET Core 中使用 DiagnosticSource 记录跟踪信息
前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...
- LeetCode Binary Search Summary 二分搜索法小结
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在LeetCode中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目 ...
- spring源码阅读(2)核心类介绍
(1).BeanFactory作为一个主接口不继承任何接口,暂且称为一级接口. (2).有3个子接口继承了它,进行功能上的增强.这3个子接口称为二级接口. (3).ConfigurableBeanFa ...
- dropzone.js使用实践
官网地址:http://www.dropzonejs.com/ 一,它是什么: DropzoneJS is an open source library that provides drag'n'dr ...