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区别
-
select * from dual;
mysql会出错——1096:没有使用到表;而oracle 会返回列:“du”,其值为“X”——行为和只有一行记录的普通表是一样的! -
select express [from dual];
mysql总是作为返回该表达式值的普通select语句执行,返回一行记录的结果集,from dual 对mysql来说根本就是摆设!而oracle里该句必须有from dual;否则报错! -
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
)
网友评论