經常遇到的乙個問題就是如果插入資料存在時,則執行更新語句,通常會先select,有就update,無則insert。
如何簡單的完成這個任務呢?
有時候可以用replace into,這時會先刪除原來的資料,再插入一條,需要注意的是,插入的資料必須能造成主鍵或唯一索引衝突,否則不會刪除舊資料。
如果在insert into後面指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key**現重複值,則執行舊行update。例如,如果列a被定義為unique,並且包含值1,則以下兩個語句具有相同的效果:
mysql>insert into table (a,b,c) values (1,2,3)
->on duplicate key update c=c+1;
mysql>update table set c=c+1 where a=1;
如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。
注釋:如果列b也是唯一列,則insert與此update語句相當:
mysql>update table set c=c+1 where a=1 or b=2 limit 1;
如果a=1 or b=2與多個行向匹配,則只有乙個行被更新。通常,您應該盡量避免對帶有多個唯一關鍵字的表使用on duplicate key子句。
您可以在update子句中使用values(col_name)函式從insert...update語句的insert部分引用列值。換句話說,如果沒有發生重複關鍵字衝突,則update子句中的values(col_name)可以引用被插入的col_name
的值。本函式特別適用於多行插入。values()函式只在insert...update語句中有意義,其它時候會返回null。
示例:
mysql>insert into table (a,b,c) values (1,2,3),(4,5,6)
->on duplicate key update c=values(a)+values(b);
本語句與以下兩個語句作用相同:
mysql>insert into table (a,b,c) values (1,2,3)
->on duplicate key update c=3;
mysql>insert into table (a,b,c) values (4,5,6)
->on duplicate key update c=9;
當您使用on duplicate key update時,delayed選項被忽略。
如果需要更新自動增長的字段,可以使用last_insert_id函式。
insert into table (a,b,c) values (1,2,3)on duplicate key update id=last_insert_id(id), c=3;
mysql,存在就更新,不存在就插入
mysql 當記錄不存在時插入,當記錄存在時更新 網上基本有三種解決方法。第一種 示例一 插入多條記錄 假設有乙個主鍵為 client id 的 clients 表,可以使用下面的語句 insert into clients client id,client name,client type sel...
mysql存在就更新,不存在就新增
insert into newest log operation action,operation,key value,bus key,content,user id,version,module,create time values action,operation,keyvalue,buskey...
Mysql 併發插入 存在不插入,存在更新操作
我們遇到挺多這樣的問題,當使用者併發提交資料,重複提交資料。導致資料重複,或者 mysql sql 報錯。幾種解決辦法,對應到幾種業務場景。這個應該是最常見的處理方式,是醉不安全的,因為一旦有併發其實完全防止不了,來看看偽 entity entity service findbyid 10 if n...