mysql 插入更新一條sql 搞定

2021-08-07 15:38:47 字數 3307 閱讀 4762

插入資料時,我們經常會遇到這樣的情況:1、首先判斷資料是否存在;2、如果不存在,則插入;3、如果存在,則更新。

在sql server中可以這樣處理:

if not exists (select 1 from t where id = 1)?

insert into t(id, update_time) values(1, getdate())

else

update t set update_time = getdate() where id = 1

那麼 mysql 中如何實現這樣的邏輯呢?mysql 中有更簡單的方法: replace into

replace into t(id, update_time) values(1, now());

或replace into t(id, update_time) select 1, now();

replace into 跟 insert 功能類似,不同點在於:replace into 首先嘗試插入資料到表中, 1. 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料。 2. 否則,直接插入新資料。

要注意的是:插入資料的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入資料,這將導致表中出現重複的資料。

mysql replace into 有三種形式:

1. replace into tbl_name(col_name, ...) values(...)

2. replace into tbl_name(col_name, ...) select ...

3. replace into tbl_name set col_name=value, ...

第一種形式類似於insert into的用法,

第二種replace select的用法也類似於insert select,這種用法並不一定要求列名匹配,事實上,mysql甚至不關心select返回的列名,它需要的是列的位置。例如,replace into tb1( name, title, mood) select rname, rtitle, rmood from tb2;?這個例子使用replace into從?tb2中將所有資料匯入tb1中。

第三種replace set用法類似於update set用法,使用乙個例如「set col_name = col_name + 1」的賦值,則對位於右側的列名稱的引用會被作為default(col_name)處理。因此,該賦值相當於set col_name = default(col_name) + 1。

前兩種形式用的多些。其中 「into」 關鍵字可以省略,不過最好加上 「into」,這樣意思更加直觀。另外,對於那些沒有給予值的列,mysql 將自動為這些列賦上預設值。

第二種方法

mysql "on duplicate key update" 語法

如果在insert語句末尾指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key中出現重複值,則在出現重複值的行執行update;如果不會導致唯一值列重複的問題,則插入新行。 

例如,如果列 a 為 主鍵 或 擁有unique索引,並且包含值1,則以下兩個語句具有相同的效果:

複製**

**如下:

insert into table (a,c) values (1,3) on duplicate key update c=c+1;

update table set c=c+1 where a=1;

如果行作為新記錄被插入,則受影響行的值顯示1;如果原有的記錄被更新,則受影響行的值顯示2。 

這個語法還可以這樣用: 

如果insert多行記錄(假設 a 為主鍵或 a 是乙個 unique索引列):

複製**

**如下:

insert into table (a,c) values (1,3),(1,7) on duplicate key update c=c+1;

執行後, c 的值會變為 4 (第二條與第一條重複, c 在原值上+1).

複製**

**如下:

insert into table (a,c) values (1,3),(1,7) on duplicate key update c=values(c);

執行後, c 的值會變為 7 (第二條與第一條重複, c 在直接取重複的值7). 

注意:on duplicate key update只是mysql的特有語法,並不是sql標準語法! 

這個語法和適合用在需要 判斷記錄是否存在,不存在則插入存在則更新的場景.

insert into .. on duplicate key更新多行記錄

如果在insert語句末尾指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key中出現重複值,則執行舊行update;如果不會導致唯一值列重複的問題,則插入新行。例如,如果列a被定義為unique,並且包含值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;

如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。

現在問題來了,如果insert多行記錄, on duplicate key update後面欄位的值怎麼指定?要知道一條insert語句中只能有乙個on duplicate key update,到底他會更新一行記錄,還是更新所有需要更新的行。這個問題困擾了我很久了,其實使用values()函式一切問題都解決了。

舉個例子,欄位a被定義為unique,並且原資料庫表table中已存在記錄(2,2,9)和(3,2,1),如果插入記錄的a值與原有記錄重複,則更新原有記錄,否則插入新行:

複製**

**如下:

insert into table (a,b,c) values 

(1,2,3),

(2,5,7),

(3,3,6),

(4,8,2)

on duplicate key update b=values(b);

以上sql語句的執行,發現(2,5,7)中的a與原有記錄(2,2,9)發生唯一值衝突,則執行on duplicate key update,將原有記錄(2,2,9)更新成(2,5,9),將(3,2,1)更新成(3,3,1),插入新記錄(1,2,3)和(4,8,2)

注意:on duplicate key update只是mysql的特有語法,並不是sql標準語法!

搞科研也是一條出路

以前感覺搞科研很屌很牛b,童年的夢想居然還是科學家,後來發現,現實真是一把殺豬刀,把童年的那點很萌的想法給削得一乾二淨。最近去了趟杭州,跟大學宿舍的乙個兄弟聚了聚。人家現在在浙大讀研,今年就轉博了。怎麼說呢,這哥們在我眼裡絕對不是搞科研的料,而且他本人對科研更是一點興趣都沒有。怎麼解釋現在這個狀況呢...

插入一條彩信

private void testinsertsms final string address address final string date date final string read read final string status status final string type typ...

SQL 如何實現一條sql語句插入1000行資料

用 sql的可程式設計性,作為測試資料用是吧 declare i int 申明乙個整形變數i set i 1 設定初始值為1 while i 1000 用 while 迴圈給定乙個迴圈結束條件小於1000 begin insert into tb user values user no cast i...