zoukankan      html  css  js  c++  java
  • 如数据不存在就插入,存在就更新

    最近在写爬虫时遇到一个问题,有些数据有隔一段时间后重新爬,我想让Mysql执行以下功能,当mysql有一条数据时,如果新数据更来就更新,如果没有,就插入,

    方法一、手工判断

    插入一条数据的时候,先判断是否存在这条记录,如果存在,我就更新这条记录,不存在就插入该条记录。原本这样的操作,我估计以前的自己会这么做。通过如下两条sql语句完成。

    SELECT COUNT(*) FROM xxx WHERE ID=xxx;

    if (x == 0)

    INSERT INTO xxx VALUES;

    else

    UPDATE xxx SET ;

    这种方法到是能实现,但是性能很差,

    方法二、使用ignore 参数

    插入一条数据,不存在就插入,存在就忽略。

           使用insert ignore语句:insert ignore into table(col1,col2) values ('a','b');

           例如插入数据:insert ignore into user_info (last_name,first_name) values ('LeBron','James');

    这样一来,如果表中已经存在last_name='LeBron'first_name='James'的数据,就不会插入,如果没有就会插入一条新数据。

    上面的是一种用法,也可以用 INSERT .... SELECT 来实现,这里就不举例了。这种方法未满足我的要求,

    方法三、使用ON DUPLICATE KEY UPDATE 

    如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 

            1INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1; 

            2UPDATE table SET c=c+1 WHERE a=1; 
    如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2 

    这种方式可以达到目的,是一个方法

    方法四、REPLACE的使用         

           使用REPLACE的最大好处就是可以将DELETEINSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETEINSERT时添加事务等复杂操作了。在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。他的语法也和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。     

     REPLACE INTO users (id,name,age) VALUES(123, '贾斯丁比伯', 22); 

    这就是我要找的终极方法,简单高效。

  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8492538.html
Copyright © 2011-2022 走看看