SQL語句 存在就更新不存在就插入

SQL server

在向表中插入數(shù)據(jù)的時(shí)候谜诫,經(jīng)常遇到這樣的情況:

  1. 首先判斷數(shù)據(jù)是否存在缰揪;
  2. 如果不存在竹握,則插入:
    3.如果存在,則更新沮协。
 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
或者
if 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

replace into 跟 insert 功能類似龄捡,不同點(diǎn)在于:replace into 首先嘗試插入數(shù)據(jù)到表中,

  1. 如果發(fā)現(xiàn)表中已經(jīng)有此行數(shù)據(jù)(根據(jù)主鍵或者唯一索引判斷)則先刪除此行數(shù)據(jù)慷暂,然后插入新的數(shù)據(jù)聘殖。
  2. 否則,直接插入新數(shù)據(jù)。
    要注意的是:插入數(shù)據(jù)的表必須有主鍵或者是唯一索引奸腺!否則的話餐禁,replace into 會(huì)直接插入數(shù)據(jù),這將導(dǎo)致表中出現(xiàn)重復(fù)的數(shù)據(jù)突照。

replace into

###插入或替換
REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
若id=1的記錄不存在帮非,REPLACE語句將插入新記錄,否則讹蘑,當(dāng)前id=1的記錄將被刪除末盔,然后再插入新記錄。
###插入或更新
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
###插入或忽略
INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);

oracle

declare num number;   
begin
    select count(1) into num from user_tables where table_name='ACCOUNT';   
    if num > 0 then   
      dbms_output.put_line('存在!');
      execute immediate 'drop table ACCOUNT '; 
    end if;   
      execute immediate 'create table Account
                        (
                                AccountID nvarchar2(50) primary key,
                                AccountName nvarchar2(50) 
                        )';  
      dbms_output.put_line('成功創(chuàng)建表!');
end; 

1:隱式游標(biāo)法 SQL%NOTFOUND SQL%FOUND

SQL%NOTFOUND 是SQL中的一個(gè)隱式游標(biāo)衔肢,在增刪查改的時(shí)候自動(dòng)打開庄岖,如果有至少有一條記錄受影響,都會(huì)返回false角骤,這就就巧妙的構(gòu)思出了第一種解決方案:

begin
update account set AccountName = '修改-a' where AccountID = '5';
IF SQL%NOTFOUND THEN
   insert into account(AccountID,AccountName) values('5','添加-b');
END IF;
end;
先根據(jù)唯一ID到數(shù)據(jù)表中修改一條記錄隅忿,如果這條記錄在表中存在,則修改邦尊,并且SQL%NOTFOUND返回false背桐。如果修改的記錄不存在,SQL%NOTFOUND返回true蝉揍,并且執(zhí)行插入語句链峭。

2:異常法 DUP_VAL_ON_INDEX

當(dāng)Oracle語句執(zhí)行時(shí),發(fā)生了異常exception進(jìn)行處理

begin
insert into account(AccountID,AccountName) values('6','添加-b');
exception 
when DUP_VAL_ON_INDEX then 
begin 
update account set AccountName = '修改-b' where AccountID = '6';
end;
end;

當(dāng)往表中插入一條數(shù)據(jù)又沾,因?yàn)楸碇杏兄麈I約束弊仪,如果插入的數(shù)據(jù)在表中已經(jīng)存在,則會(huì)拋出異常杖刷,在異常拋出后進(jìn)行修改励饵。

3:虛擬表法 dual:

dual是一個(gè)虛擬表,用來構(gòu)成select的語法規(guī)則滑燃,oracle保證dual里面永遠(yuǎn)只有一條記錄役听。

declare t_count number;
begin
select count(*) into t_count from dual where exists(select 1 from account where AccountID='11');
if t_count< 1 then
  dbms_output.put_line('添加');
  insert into account(AccountID,AccountName) values('11','添加-11');
else
  dbms_output.put_line('修改');
  update account set AccountName = '修改-11' where AccountID = '11';
  end if;
end;

先聲明一個(gè)變量t_count,表dual表的值賦給t_count,如果這個(gè)值小于1表窘,表示記錄不存在典予,進(jìn)行插入操作,反之乐严,存在就進(jìn)行修改操作瘤袖。

4:no_data_found法

先查找要插入的記錄是否存在,存在則修改昂验,不存在則插入捂敌。具體的實(shí)現(xiàn)如下:

declare t_cols number;
begin
select AccountName into t_cols from account where AccountID = '8';
exception 
when no_data_found then begin 
   --dbms_output.put_line('添加');
   insert into account(AccountID,AccountName) values('8','添加-8');
end;
when others then 
  begin
    --dbms_output.put_line('修改');
    update account set AccountName = '修改-8' where AccountID = '8';
end;
end;

5:merge法

先來看一下merge的語法昭娩,

MERGE INTO table_name alias1   
USING (table|view|sub_query) alias2  
ON (join condition)   
WHEN MATCHED THEN   
    UPDATE table_name SET col1 = col_val1
WHEN NOT MATCHED THEN   
    INSERT (column_list) VALUES (column_values);
模仿
merge into Account t1  
using (select '3' AccountID,'肖文博' AccountName from dual) t2  
on (t1.AccountID = t2.AccountID)  
when matched then  
     update set t1.AccountName = t2.AccountName
when not matched then  
     insert values (t2.AccountID, t2.AccountName);  
commit; 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市黍匾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呛梆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件填物,死亡現(xiàn)場(chǎng)離奇詭異纹腌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滞磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門升薯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人击困,你說我怎么就攤上這事涎劈。” “怎么了阅茶?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蛛枚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我脸哀,道長(zhǎng)蹦浦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任撞蜂,我火速辦了婚禮盲镶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝌诡。我一直安慰自己溉贿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布送漠。 她就那樣靜靜地躺著顽照,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闽寡。 梳的紋絲不亂的頭發(fā)上代兵,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音爷狈,去河邊找鬼植影。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涎永,可吹牛的內(nèi)容都是我干的思币。 我是一名探鬼主播鹿响,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谷饿!你這毒婦竟也來了惶我?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤博投,失蹤者是張志新(化名)和其女友劉穎绸贡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅哗,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡听怕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虑绵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尿瞭。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翅睛,靈堂內(nèi)的尸體忽然破棺而出声搁,到底是詐尸還是另有隱情,我是刑警寧澤捕发,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布酥艳,位于F島的核電站,受9級(jí)特大地震影響爬骤,放射性物質(zhì)發(fā)生泄漏充石。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一霞玄、第九天 我趴在偏房一處隱蔽的房頂上張望骤铃。 院中可真熱鬧,春花似錦坷剧、人聲如沸惰爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撕瞧。三九已至,卻和暖如春狞尔,著一層夾襖步出監(jiān)牢的瞬間丛版,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工偏序, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留页畦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓研儒,卻偏偏與公主長(zhǎng)得像豫缨,于是被迫代替她去往敵國(guó)和親独令。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容