mysql 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 表的应用地方还不少。。。把我发现的三个应用地方都加上:


select express from dual #这条 sql 就类似上面的查看系统时间一样。把 express 替换成表达式或函数就行;


select express from dual where condition #这条 sql 只是对上面的一点扩展 加上一个 where 条件。其实这个 where 条件跟我们平时使用的 where 条件没什么区别。执行的时候


也是先判断 where 子句是否成立,满足然后再执行 select 中的 express,最后返回 express 执行的值;如果 where 子句不成立,则返回空。比如:select 1+1 from where


 1=1,将返回 2 ;


第三个就是一条比较实用的 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 = key);


来个实际点的例子吧


INSERT INTO clients  (client_id, client_name, client_type)  


SELECT 10345, ’IBM’, ’advertising’  


FROM dual 


WHERE not exists (select * from clients  where clients.client_id = 10345);  

再来一个
  
insert into cdb_shop  (uid,shop) 

SELECT '2021','202298' 

from dual 

where not exists(SELECT * FROM cdb_shop WHERE uid = '2021'); 

“SELECT '2021','202298' ”就是values语句的变种,格式就这亲样写就对了。注意值的顺序要与inert语句中列的顺序相对应。

关键的地方是where语句,它的结果决定了是否执行insert语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值