记录问题 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构建成我们需要的表,并指定了数据项.
解释就是 : 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 版本不可以
版权声明: 本文为 InfoQ 作者【浅^安】的原创文章。
原文链接:【http://xie.infoq.cn/article/c6ad648b7310a74aaea5cc6ff】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论