情景如下:
"今日前端忽然說句, 我需要做個判斷, 不能重復收藏, 我猶如頸有寒冰不寒而栗, 於是思考我該怎么做?為什么她都思考到了我沒有思考到這是我的工作啊"
思考后得到三種解決方案:
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 = ? );

INSERT INTO content ( detail, status, beginTime, endTime) SELECT @detail, 1, NULL, NULL FROM DUAL WHERE NOT EXISTS( SELECT contentId FROM content WHERE detail=@detail);
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