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

本文介绍了在MySQL中处理主键冲突的四种方法:1) 使用`REPLACE`语句替换已有行;2) `INSERT IGNORE`忽略错误并更新已存在数据;3) 通过`DECLARE HANDLER`自定义异常处理;4) `ON DUPLICATE KEY UPDATE`在插入时更新。每种方法都有其适用场景,可以帮助你在数据导入或更新时确保数据的完整性和一致性。
摘要由CSDN通过智能技术生成

个人实例:

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表结构如下

221e9bfefb97d8cab16495ef11328f61.png

1、replace语法

select * from test;

2e93d8be505ae1f0fec5f89abf86b6ae.png 

现在插入(1,’xiaohong’)数据,发现出现错误,错误提示(主键重复输入’1’),证明当insert插入相同主键时是会报错的。

5bf55ad364c76e1c04adc89d6c2fb1e1.png 

现在我们来replace语句测试一下会不会不报错,执行成功

77c32515551b670564212ad8b1330012.png 

查询一下我们的表信息,发现之前的记录(1,’xiaozhang’)已经被替换成(1,’xiaohong’),

证明我们插入相同的主键信息,replace会替换原有信息。

f107650d81b3b7dc676941091b3e139e.png 

replace语法执行和数据库中主键重复的数据会替换原有信息,那么执行不同的信息会有怎么样的操作呢?(发现执行和数据库中没有主键重复的数据,则执行插入操作)

21ee06b9c9a099209b17c3fc23caefef.png

b8732c37218ced2de74dae20bf84f59c.png

2、ignore

这里我们应用insert ignore执行插入(1,’xiaoplan’),运行成功,但是数据没有插入到test表中。

d437261e46c3381a6403ed176482f62d.png 

6e2838b76ca65c5db548c099f2a8c006.png 

insert ignore 和update联合使用(发现主键为’1’的’xiaohong’被更新为’xiaolan’)

ecc7ef0f82c40972dca018115ae360bd.png 

运行结果图

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’

91650769e93ce6c2e114fd54f8405b4c.png 

直接上代码

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

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

d5d0658e81820ce1fe6a9929f3430282.png

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).

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

c48f7b49b0a3d809ab11a13e8d2cbecb.png

插入不同数据,如果主键不同,则插入

8b1c954da40b8eee31d62cb4cf1f1105.png 

看一下主键相同情况是否可以更新多列,(可以执行)

7ab6800b59e8fbc96f9814fd366f2ba1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值