mysql跳过异常数据_MySQL跳过已存在的数据

一、背景

在使用MySQL进行插入的时候,遇到了一个场景:当插入的数据不再数据库中的时候就插入,否则就跳过。

二、方法

我们可以使用下面的SQL语句进行处理,处理语句如下。在这个里面有几个重要的地方,DUAL和insert的操作。

标准:

INSERT INTO table(primarykey, field1, field2, ...)SELECT key, value1, value2, ...FROMdualWHERE not exists (select * from table where primarykey = id);

例子:

INSERT INTO mygame (userId,gameId) SELECT 1,2 from DUAL WHERE not EXISTS (SELECT * FROM mygame WHERE userId=6 and gameId=1)

从上述SQL的例子中讲述每一部分的内容及含义:

2.1 首先是下面的部分

(SELECT * FROM mygame WHERE userId=6 and gameId=1)

这部分的含义是从mygame中获取用户id为6同时游戏id为1的数据,这里的查询语句作用就是看有没有这个数据,因此是否查询所有属性不重要,可以直接设置为1,如下面的格式:

SELECT 1 FROM mygame WHERE userId=6 and gameId=1)

2.2 然后是DUAL查询的部分

SELECT 1,2 from DUAL WHERE not EXISTS (SELECT 1 FROM mygame WHERE userId=6 and gameId=1)

这一部分我们使用了一个not exists的关键查询,意思是不存在则选择出数据,如果存在选择就是空,这里有一个很重要部分就是DUAL表的查询,这是一个虚空表,select的表头和值都是一样的。如我执行下面的SQL语句:

SELECT 1,9,0 from DUAL

结果

4d4c6ba1653457df879f7fca2b8c9d60.png

note:如果使用*号查询会使得数据结果错误,所以这就是为什么说他是虚拟表的原因。

a8486c2516e5891791997f23b9806f42.png

2.3 最后是insert部分

INSERT INTO mygame (userId,gameId) SELECT 1,2 from DUAL WHERE not EXISTS (SELECT * FROM mygame WHERE userId=6 and gameId=1)

我们将从虚空表中的数据获取出来并插入到mygame中,插入的数据就是虚空表的数据,也就是我们设置的1,2的值,与正常的插入一样,如果字段不完全,需要具体字段,如果完全可以省略插入的字段,但是要按照顺序,如下面的情况:

INSERT INTO mygame SELECT 1,9,0 from DUAL WHERE not EXISTS (SELECT 1 FROM mygame WHERE userId=6 and gameId=1)

如果不完全就会出现下面的错误

9eb3313b2ac7c8263467b934435217f2.png

三、总结

这种很有效的插入方法已经介绍完了,在使用的时候需要注意,DUAL表的字段查询会输出你设计的字段,从DUAL表中选取的数据就是你要插入的字段,否则就会一直添加。

5ce6d3d863635e873a03f9e395b370ae.png

8e3ffddc60efe941956cda4c865ee692.png

直到修改为6,12为止,才会结束

9c61bc5cb7884508449e909a471b43e8.png

93304be3562e009a1b297240a262b064.png

四、参考

dual表介绍:

官方介绍:

其他方法:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值