• 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还有漫长的路要走...

  • 相关阅读:
    sql developer Oracle 数据库 用户对象下表及表结构的导入导出
    安装Win7和Office2010并激活
    Python内置方法的时间复杂度(转)
    服务框架Dubbo(转)
    ntpd和ntpdate
    ntpdate server时出错原因及解决
    什么才是程序员的核心竞争力
    使用DNSPod来处理网站的均衡负载(转)
    ubuntu设置服务开机启动
    Linux运行级别
  • 原文地址:https://www.cnblogs.com/renfanzi/p/8340967.html
Copyright © 2020-2023  润新知