更新操作是使用數據庫最常見的操作之一,下面將為您詳細介紹MYSQL中無重復插入數據更新語法,供您參考,希望對您學習數據更新能有所幫助。
如果你指定了ON DUPLICATE KEY UPDATE命令語句,那麼在唯一索引或者主索引的作用下將不插入與數據庫記錄重復的內容,但同時會更新數據庫中的舊記錄。例如,字段a被聲明為唯一索引並且裡面只包含有值為1的記錄,以下兩個語句會達到同樣的效果:
一、INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
二、UPDATE table SET c=c+1 WHERE a=1;
受影響的是a=1的行,當插入時c的值加1。
如果字段b也是唯一的話,這個插入語句將和以下語句的效果一樣:
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2匹配了不止一行,也只是第一行被更新。一般地,如果表中有多個唯一索引的話,你應該避免在使用用ON DUPLICATE KEY子句。
你可以在插入更新語句 INSERT ... UPDATE 中使用 VALUES(字段名) 函數去關聯某一行記錄。也就是說, VALUES(字段名) 可以用在UPDATE語句中去更新某字段的值而不會出現重復鍵。這個函數在多行插入中尤其有用。但是函數 VALUES() 僅當用在 INSERT ... UPDATE 語句中才有意義,否則會返回NULL。例如:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
這個語句和下面兩個是同效果的:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;
如果表中包含有一個自動遞增字段AUTO_INCREMENT,並用 INSERT ... UPDATE 插入一行,函數 LAST_INSERT_ID()會返回AUTO_INCREMENT的值,如果這個語句更新某一行, LAST_INSERT_ID() 就沒有意義了。但是,你可以通過用 LAST_INSERT_ID(expr)使它變得有意義,假如id字段是自動遞增欄的話,使 LAST_INSERT_ID() 對更新語句有意義的方法如下:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
如果你使用 ON DUPLICATE KEY UPDATE 語句的話,延遲執行選項 DELAYED 將被忽略。
SQL中兩個關聯表批量更新數據的方法
數據更新監控CDC介紹
SQL函數取得系統日期
sql函數遍歷BOM表的方法
判斷閏年的SQL函數