回忆之城
生命在于折腾
posts - 575,comments - 9,trackbacks - 0

INSERT INTO myuser
(userid, username, pwd) 
SELECT NULL, 'IBM', '123' 
FROM dual 
WHERE not exists (select * from myuser 
where username = 'IBM');

 

注释:dual 是个临时表

转载自:http://thobian.info/?p=1035

mysql dual虚拟表

虚拟表dual 其实我是今天第一次听说,虽然以前有过它的应用。说不定你也用过哦,看这条sql:select sysdate(); 熟悉不!?虽然我不是狠熟悉,但我确定我用过它,其实他是:select sysdate() from dual 的简写。

看一下mysql官方对这个表的解释吧(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.

官方的解释说:纯粹是为了满足select … from…这一习惯问题,mysql会忽略对该表的引用。

碰到了新问题就去网上搜集了一下,发现原来dual表的应用地方还不少。。。把我发现的三个应用地方都加上:

  1. select express from dual #这条sql就类似上面的查看系统时间一样。把express替换成表达式或函数就行
  2. select express from dual where condition #这条sql只是对上面的一点扩展 加上一个where条件。其实这个where条件跟我们平时使用的where条件没什么区别。执行的时候也是先判断where子句是否成立,满足然后再执行select中的express,最后返回express执行的值;如果where子句不成立,则返回空。比如:select 1+1 from where 1=1,将返回2。
  3. 第三个就是一条比较实用的SQL语句了!你否想过:插入数据时先判断一下这条 记录是否已存在这个问题!?也许很多时候为了解决这个问题,你会先select一下,根据他的结果再决定是否继续写入数据库。但是用dual这个表,可以让你仅一条SQL就可以解决这个问题哦!
    SQL就是这样写的:

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

    下面是我测试时的结果图,附上:

    mysql dual表测试图片

当然,好奇的你肯定想到了,这个dual表到底是个什么东西、它里面到底放着什么!是不想是用:select * from `dual`; 和 show create table `dual` 查看一下他的记录。答案我告诉你把,这两条sql都会返回错误!错误??对,确实都会返回错误,这可能就是为什么叫他虚拟表的原因吧!

ok,over 这就是今天学到一点小东西,给大家分享完了。。。。

posted on 2014-04-28 15:51 回忆之城 阅读(315) 评论(0)  编辑 收藏 引用 所属分类: unix/linux
只有注册用户登录后才能发表评论。