1. 程式人生 > >如數據不存在就插入,存在就更新

如數據不存在就插入,存在就更新

插入數據 指定 插入行 ast select OS 原子操作 定義 重復記錄

最近在寫爬蟲時遇到一個問題,有些數據有隔一段時間後重新爬,我想讓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);

這就是我要找的終極方法,簡單高效。

如數據不存在就插入,存在就更新