美文网首页
dual用法

dual用法

作者: 三年级小弟 | 来源:发表于2020-09-24 15:20 被阅读0次

dual简介:

在Mysql和SQL Server中可以直接select 1不需要加from 表名就可以执行 ,而在Oracle中要满足select from的结构:
select 1不能实现满足上述结构,于是Oracle引入dual虚拟表来满足结构。 Oracle这样表示:select 1 from dual

现在一般线上使用的MySQL都是5.5以上的,在mysql里也存在和oracle里类似的dual虚拟表:官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用。在mysql中Dual表的使用示例如下:


mysql/oracel中Dual区别

  1. select * from dual;     
    mysql会出错——1096:没有使用到表;而oracle 会返回列:“du”,其值为“X”——行为和只有一行记录的普通表是一样的!
  2. select express [from dual];
    mysql总是作为返回该表达式值的普通select语句执行,返回一行记录的结果集,from dual 对mysql来说根本就是摆设!而oracle里该句必须有from dual;否则报错!
  3. select express from dual where 0=2;
    mysq 和 oracle的行为一致:该句就如同你认为的正常表那样——会先计算where的条件,再行计算express;这里的where条件会决定expres是否会返回!
oracel中dual用法参考:https://blog.csdn.net/z_atmosphere/article/details/82625058

实现防止重复插入

下面这段代码执行时会先判断下面的where语句的条件是否满足,
如果不满足,则select expres from dual的值就没有值,这时不会insert。
如果满足就会执行执行INSERT插入

INSERT INTO qrdish_store_collect (tenant_id,store_id,user_id)
        SELECT  #{tenantId},#{storeId},#{userId} FROM DUAL
        WHERE NOT EXISTS (
            SELECT  *
            FROM qrdish_store_collect
            WHERE user_id = #{userId}
            AND tenant_id = #{tenantId}
            AND store_id = #{storeId}
            AND delete_flag = 0
        )

相关文章

网友评论

      本文标题:dual用法

      本文链接:https://www.haomeiwen.com/subject/ronzyktx.html