mysql insert exists || mysql 判斷數據是否存在


 

情景如下:

  "今日前端忽然說句, 我需要做個判斷, 不能重復收藏, 我猶如頸有寒冰不寒而栗, 於是思考我該怎么做?為什么她都思考到了我沒有思考到這是我的工作啊"

  思考后得到三種解決方案:

    1. 兩條sql, 然后通過第一條sql判斷

    2. 一條sql, insert 中使用exists方式(暫時不會,下面講解)

    3. 存儲過程

 

  后請教公司一同事,得到結論, 如果是兩個客戶端同時操作就采用存儲過程, 如果不是, 那么第一種第二種都ok, 后決定采用方案2

  

INSERT INTO table(column1,column2,column3 ...columnN)  
SELECT value1,value2,value3 ...valueN  
FROM dual  
WHERE NOT EXISTS(  
      SELECT *  
      FROM table  
      WHERE value = ?  
);  
sql結構

 

INSERT INTO content (  
    detail,  
    status,  
    beginTime,  
    endTime)   
SELECT  
    @detail,  
    1,  
    NULL,  
    NULL  
FROM DUAL  
    WHERE NOT EXISTS(  
        SELECT contentId   
        FROM content   
        WHERE detail=@detail);  
sql示例

dual是為了構建查詢語句而存在的表,Oracle中很常見,配合INSERT ... SELECT構建成我們需要的表,並指定了數據項. 
EXISTS通過這個判斷是否存在的函數,就免去了我們做IF-ELSE的冗繁操作

 判斷一條數據是否存在, 如果存在,就修改update;如果不存在, 就添加insert

那么如果這樣,一般情況下,我就要發出三條sql,第一條sql查詢這條記錄,然后用程序判斷,如果存在,則更新,如果不存在,則插入。

但是這樣,就略顯麻煩了,而且要發出三條sql,那么,其實是有辦法一次性解決的。

解決辦法是用存儲過程

 

BEGIN
    -- 定義一個變量來保存該記錄是否存在
    declare num int;
    -- 這條sql,就是查詢對應的記錄有多少條,注意 into num 這兩句話,就是把count(*) 查出的值,賦給到num中
    select count(*) into num from t_count_view where TO_DAYS(now())=TO_DAYS(day);
    -- 接下來的就是判斷了,注意,判斷是否等於,只有一個等於號
    if(num=0)
    -- 等於號之后,還要寫一個Then,代表條件成立后要執行的sql
        Then
        insert into t_count_view(view_people,view_num,day)values(1,1,now());
  -- else可以直接用,不需要加then
    else
        update t_count_view set view_people=view_people+1;
    -- 但是當if使用完之后,一定要寫end if,代表着if的條件判斷結束了
  end if;
END
存儲過程

 

發現自己的sql還有漫長的路要走...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM