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


 

2019.03.31 17:07:40字數 498閱讀 26,117

SQL server

在向表中插入數據的時候,經常遇到這樣的情況:

  1. 首先判斷數據是否存在;
  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 功能類似,不同點在於:replace into 首先嘗試插入數據到表中,

  1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。
  2. 否則,直接插入新數據。
    要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重復的數據。

replace into

###插入或替換 REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99); 若id=1的記錄不存在,REPLACE語句將插入新記錄,否則,當前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('成功創建表!'); end; 

1:隱式游標法 SQL%NOTFOUND SQL%FOUND

SQL%NOTFOUND 是SQL中的一個隱式游標,在增刪查改的時候自動打開,如果有至少有一條記錄受影響,都會返回false,這就就巧妙的構思出了第一種解決方案:

begin
update account set AccountName = '修改-a' where AccountID = '5'; IF SQL%NOTFOUND THEN insert into account(AccountID,AccountName) values('5','添加-b'); END IF; end; 先根據唯一ID到數據表中修改一條記錄,如果這條記錄在表中存在,則修改,並且SQL%NOTFOUND返回false。如果修改的記錄不存在,SQL%NOTFOUND返回true,並且執行插入語句。 

2:異常法 DUP_VAL_ON_INDEX

當Oracle語句執行時,發生了異常exception進行處理

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; 

當往表中插入一條數據,因為表中有主鍵約束,如果插入的數據在表中已經存在,則會拋出異常,在異常拋出后進行修改。

3:虛擬表法 dual:

dual是一個虛擬表,用來構成select的語法規則,oracle保證dual里面永遠只有一條記錄。

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; 

先聲明一個變量t_count,表dual表的值賦給t_count,如果這個值小於1,表示記錄不存在,進行插入操作,反之,存在就進行修改操作。

4:no_data_found法

先查找要插入的記錄是否存在,存在則修改,不存在則插入。具體的實現如下:

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; 
 
 
2人點贊
 
SQL

 

 https://www.jianshu.com/p/602ba0b8395b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM