在向表中插入數據的時候,經常遇到這樣的情況:
1、首先判斷數據是否存在;
2、如果不存在,則插入;
3、如果存在,則更新。
在 SQL Server 中可以這樣寫:
復制代碼 代碼如下:
if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() where id = 1
在MySQL 中也可以先select,判斷是否存在,存在則 update 否則 insert
但在MySQL 中有更簡單的方法,使用 replace into關鍵字
復制代碼 代碼如下:replace into table(id, update_time) values(1, now());
或
復制代碼 代碼如下:
replace into table(id, update_time) select 1, now();
replace into 跟 insert 功能類似,不同點在於:replace into 首先嘗試插入數據到表中。
1、如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然後插入新的數據。
2、 否則,直接插入新數據。
要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重復的數據。
MySQL中replace into有三種寫法:
復制代碼 代碼如下:
1. replace into table(col, ...) values(...)
2. replace into table(col, ...) select ...
3. replace into table set col=value, ...
前兩種形式用的多些。其中 “into” 關鍵字可以省略,不過最好加上 “into”,這樣意思更加直觀。
另外,對於那些沒有給予值的列,MySQL 將自動為這些列賦上默認值。
可惜的是replace不支持update某些特性,也就不能直接當作update使用:
常見update寫法:update table set col=col+1 where id=1;
使用replace into不支持這樣的寫法:replace into table set col=col+1,id=1;
1、首先判斷數據是否存在;(沒問題)
2、如果不存在,則插入;(沒問題)
3、如果存在,某字段值在原來的基礎上加上或減去某個數,如加一操作。(不支持)
set simtime=replace(time,'-','');即可
mysql的內置函數都是全局函數,沒有對象的概念 ,所以不能使用set simtime=time.replace('-','')類似的語法。
MySQL 當記錄不存在時insert,當記錄存在時更新
網上基本有三種解決方法。
第一種:
示例一:insert多條記錄
假設有一個主鍵為 client_id 的 clients 表,可以使用下面的語句:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
示例一:insert單條記錄
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以讓你在 select 語句後面直接跟上要insert字段的值,即使這些值還不存在當前表中。
第二種:
INSERT 中 ON DUPLICATE KEY UPDATE的使用
如果您指定了ON DUPLICATE KEY UPDATE,並且insert行後會導致在一個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;
如果行作為新記錄被insert,則受影響行的值為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)可以引用被insert的col_name的值。本函數特別適用於多行insert。 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......余下全文>>