一、背景

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

二、方法

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

标准:

INSERT INTO table (primarykey, field1, field2, ...)
SELECT key, value1, value2, ...
FROM dual
WHERE 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

结果

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

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)

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

三、总结

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

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

四、参考

dual表介绍:

https://my.oschina.net/moooofly/blog/138355

官方介绍:

https://dev.mysql.com/doc/refman/8.0/en/select.html

其他方法:

https://www.cnblogs.com/zhang-cb/p/12746320.html

posted on 2020-12-16 10:15  蔚蓝色の天空  阅读(980)  评论(0编辑  收藏  举报