记录问题 INSERT INTO table ... SELECT ... FROM dual WHERE not exists (...) 问题

用户头像
浅^安
关注
发布于: 2020 年 09 月 13 日
记录问题 INSERT INTO table ... SELECT ... FROM dual WHERE not exists (...)问题

前言 : 在处理记录是否已存在这个问题时 , 遇到的问题 , 分享出去希望给大家避坑!!!



初始"错误" sql :

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



"正确" sql :

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



细心的老哥们看到他们的区别了 ,是的 "FROM dual" (ps : 胆大心细是我们程序员的基本要求 , 同时也给自己一个告诫 , 以后再编码中一定要做到细心!)



因为不太了解 dual 这个虚拟表是什么 , 在查找资料有个初步了解 :

dual是为了构建查询语句而存在的表,在配合INSERT ... SELECT构建成我们需要的表,并指定了数据项.

  1. 官网介绍 : http://dev.mysql.com/doc/refman/5.0/en/select.html

DUAL is purely for the convenience of people who require that all SELECT statements should
have FROM and possibly other clauses.MySQL may ignore the clauses. MySQL does not require
FROM DUAL if no tables are referenced.

解释就是 : DUAL纯粹是为了方便那些要求所有SELECT语句都应该具有FROM和其他子句的。 MySQL可能会忽略这些子句。如果没有引用表,MySQL不需要FROM DUAL。



当然,肯定想到了这个 dual 表到底是个什么东西、它里面到底放着什么!想用:select * from dual; 和 show create table dual 查看一下他的记录。但是这两条 sql都会返回错误!可能因为就是虚拟表吧



重点 : 为什么在本地执行数据库执行 初始"错误" sql 能够成功而别人数据库执行失败 ?

因为数据库语法版本差异导致!!! 5.6版本和5.7版本的写法不一样,高版本的不能到低版本执行,在 5.7 版本的可以忽略 from dual , 5.6 版本不可以



发布于: 2020 年 09 月 13 日 阅读数: 28
用户头像

浅^安

关注

我有个故事,两年后我来讲 2018.08.13 加入

若问此生之所求,唯有头上再也无发,证明我已成真佛!

评论

发布
暂无评论
记录问题 INSERT INTO table ... SELECT ... FROM dual WHERE not exists (...)问题