我們寫了接口給使用者調用時,有可能會出現數據重複推送的問題,那麼我們就應該判斷數據是否已經推送過,如果對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.當語句中存在唯一索引和唯一主鍵時,以唯一主鍵爲查找條件