好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MySQL跳过已存在的数据

在使用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测试数据/doc/refman/8.0/en/select.html

其他方法:

https://HdhCmsTestcnblogs测试数据/zhang-cb/p/12746320.html

MySQL跳过已存在的数据

标签:修改   个数   使用   sql语句   执行   sele   and   就会   dual   

查看更多关于MySQL跳过已存在的数据的详细内容...

  阅读:40次