1. 程式人生 > >on duplicate key update 的用法

on duplicate key update 的用法

專案中資料的操作有時候會令人頭大,遇到一個需求:

需要將資料從A資料庫的a資料表同步到B資料庫的b資料表中(ab表結構相同,但不是主從關係。。。just同步過去)

第一次同步過去,b表為空,同步很簡單。

但是當a表中的某些資料更新且增加了新資料之後,再想讓兩個表同步就有些麻煩了。(如果把b表清空,重新同步,資料量過大的話耗費的時間太長,不是一個好辦法)

想著能不能按照時間段來做更新,這段時間內有新資料了,就插入資料,有資料更新了就更新資料。先說下我的思路:

步驟:

1.首先我從a表取出某一時間段的資料(分段更新)

2.往b表內放資料,根據主鍵判斷b表是否已經有此條記錄,沒有此資料則插入,有了記錄則對比資料是否一樣,一樣則不做更改,不一樣就做更新操作。

第一步很好做,第二步就有點繁瑣了,就想著偷懶,網上查了下發現mysql有個語句能滿足我的需求。

在MySQL資料庫中,如果在insert語句後面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新;如果插入的行資料與現有表中記錄的唯一索引或者主鍵不重複,則執行新紀錄插入操作。

說通俗點就是資料庫中存在某個記錄時,執行這個語句會更新,而不存在這條記錄時,就會插入。

用法 : insert into tablename(field1,field2,field3,......) values(value1,value2,value3,....) on duplicate key update field1=value1,field2=value2,field3=value3,......;

注意點:

因為這是個插入語句,所以不能加where條件。

如果是插入操作,受到影響行的值為1;如果更新操作,受到影響行的值為2;如果更新的資料和已有的資料一樣(就相當於沒變,所有值保持不變),受到影響的行的值為0。