mysql數據存在則更新,不存在則插入新數據解決辦法

我們寫了接口給使用者調用時,有可能會出現數據重複推送的問題,那麼我們就應該判斷數據是否已經推送過,如果對sql不太熟悉的可能會用想到先select count(1)然後根據返回值判斷更新還是插入,但是這種做法會有嚴重的效率問題,還有數據錯亂的問題,千萬別這麼做。。

我們可以使用ON DUPLICATE KEY UPDATE 這個語法(mysql特有)

INSERT INTO 表名 (

   字段1,字段2,字段3

)

VALUES

   (value1, value2,value3)

ON DUPLICATE KEY UPDATE

   字段1=values(字段1) ;

如果要更新部分是固定值則是

   字段1 = “xxxx”;

 

 

 ON DUPLICATE KEY UPDATE的作用,當insert已經存在的記錄時,執行Update

執行更新操作的條件是主鍵或者唯一索引找到要插入的數據,這樣說可能有點難理解,我們來舉個栗子

下面一張表person,id是唯一主鍵

 

INSERT INTO person (
    id,
    name,
    age,
    gender,
    createTime,
    modifyTime,
    address
)
VALUES
    (
        1,
        '張三',
        10,
        1,
        now(),
        NULL,
        '四川'
    ) ON DUPLICATE KEY UPDATE modifyTime = now();

則通過id=1去查找數據,因爲id=1不存在則插入

再次執行,因爲已經存在了,所以會進行更新操作

ON DUPLICATE KEY UPDATE 後面的是更新語句

如果是固定值則使用

字段名 = "xxxx"

如果是動態值則使用

字段名 = values (xxxx)

(xxx)必須是insert中包含的字段 ,

例子

INSERT INTO person (
    name,
    age,
    gender,
    createTime,
    modifyTime,
    address
)
VALUES
    (
        '張三',
        10,
        1,
        now(),
        NULL,
        '四川'
    ) ON DUPLICATE KEY UPDATE age= values(age); 

values(age)對應into中的對應字段名(大小寫需要一致)

 

以下幾種場景需要注意:

1.沒有唯一主鍵或者唯一索引時,則永遠不會進行更新操作。

2.子表多條數據有相同的數據,主鍵ID不作爲更改依據時,需要建立唯一索引,我們建立name_address的唯一索引。

執行以下語句

INSERT INTO person (
    name,
    age,
    gender,
    createTime,
    modifyTime,
    address
)
VALUES
    (
        '張三',
        10,
        1,
        now(),
        NULL,
        '廣東'
    ) ON DUPLICATE KEY UPDATE modifyTime = now();

 

 

則可以成功更新

3.當語句中存在唯一索引和唯一主鍵時,以唯一主鍵爲查找條件

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章