一、背景
在使用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
其他方法: