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查询这条记录,而后用程序判断,若是存在,则更新,若是不存在,则插入。event

可是这样,就略显麻烦了,并且要发出三条sql,那么,实际上是有办法一次性解决的。table

解决办法是用存储过程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还有漫长的路要走...

相关文章
相关标签/搜索