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

 

情景以下:

  "今日前端突然說句, 我須要作個判斷, 不能重複收藏, 我猶如頸有寒冰毛骨悚然, 因而思考我該怎麼作?爲何她都思考到了我沒有思考到這是個人工做啊"前端

  思考後獲得三種解決方案:sql

    1. 兩條sql, 而後經過第一條sql判斷ide

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

    3. 存儲過程spa

 

  後請教公司一同事,獲得結論, 若是是兩個客戶端同時操做就採用存儲過程, 若是不是, 那麼第一種第二種都ok, 後決定採用方案2code

  

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的冗繁操做blog

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

那麼若是這樣,通常狀況下,我就要發出三條sql,第一條sql查詢這條記錄,而後用程序判斷,若是存在,則更新,若是不存在,則插入。table

可是這樣,就略顯麻煩了,並且要發出三條sql,那麼,實際上是有辦法一次性解決的。class

解決辦法是用存儲過程變量

 

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還有漫長的路要走...

相關文章
相關標籤/搜索