1. 程式人生 > >mysql dual 虛擬表實現不重複外掛

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語句。