在oracle中,「merge into」用於更新表中的數據,可以將一個表中的數據插入另一個表中,若被插入的表中已經有該數據則更新該數據,若沒有該資料則會在插入的表中新增資料。
本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。
Oracle9g引入了MERGE命令,你能夠在一個SQL語句中對一個表同時執行inserts和update操作. MERGE命令從一個或多個資料來源中選擇行來update或insert到一個或多個表.在Oracle 10g中MERGE有以下一些改進:
#1、UPDATE或INSERT子句是可選的
#2 、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常數過濾謂詞來insert所有的行到目標表中,不需要連接來源表和目標表
#4、UPDATE子句後面可以跟DELETE子句來移除一些不需要的行
5、來源表就是using關鍵字後面接的表,目標表就是要被merge into的表
6、merge into 中所有的update、insert、delete都是針對目標表來操作的。由於merge into已經制定了操作的表,所以update、insert、delete都不需要再顯示指出表名
7、總之,merge into的作用就是解決用B表跟新A表數據,如果A表中沒有,則把B表的數據插入A表或向一個表中插入數據,如果該表已有該數據則更新,反之新增數據。
語法:
MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sql and using just like a table] ON ([conditional expression here] AND [...]...) WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]
接下來我們來直接進行測試:
先建立一個表TEST_ONE
create table TEST_ONE( ID NUMBER not null primary key, NAME VARCHAR2(255), IP VARCHAR2(255), MEMO VARCHAR2(255))commit;
隨便加入幾個資料作為測試資料
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (1, '2', '3', '周文军'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (2, '66', '366', '2656'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (3, '5656', '626', '2626'); INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (4, '5656', '2626', '626');
好了,我們的資料表已經建成,如下圖:
如果我們需要新增一條數據,一般會這樣進行
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (5, 'mrhu', '127.0.0.1.0', '王先生的IP');
但我們希望可以先用ID進行判斷,沒有該數據新增,有該數據更新,怎麼實現呢?
那麼merge into指令來了,直接擼程式碼:
merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'王先生的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
運行如下:
我們再來看看表中資料:
資料新增成功!
那我們要如何測試更新呢?很簡單,我們將memo='王先生的IP' 改為memo='本大美女的IP'來進行測試
merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'本大美女的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
運行如下:
我們再來看看表中資料:
資料更新成功啦!
我們再建立一個表TEST_TWO作為表B,TEST_ONE作為表A
create table tes( ID NUMBER not null primary key, CODE VARCHAR2(255), MEMO VARCHAR2(255));commit;
好了表TEST_TWO建立好了,我們先來新增一條資料吧!
INSERT INTO ROOT.TEST_TWO (ID, CODE, MEMO) VALUES (5, 'mrhu', '隔壁老王的IP');
我們再看看TEST_TWO中的資料:
我們來將TEST_ONE中的資料導到我們新建的表中,透過分析,我們發現,TEST_TWO 表中有了一條數據,ID為5,TEST_ONE中也有一條ID為5的數據,預期執行效果為TEST_TWOID為5的數據的memo字段值將更新為TEST_ONE中的'本大美女的IP',其他值進行新增操作。
我們寫程式來驗證一下:
merge into TEST_TWO mtb using (select id,name,ip,memo from TEST_ONE) mmb on (mtb.id = mmb.id)when matched THENUPDATE set mtb.code = mmb.name,mtb.memo = mmb.memo when not matched THENinsert (mtb.id,mtb.code,mtb.memo) values (mmb.id,mmb.name,mmb.memo);
我們來看看效果:
執行結果與預期結果一致,好了,merge into的用法你們學會了嗎! 喜歡的關注支持一下!
推薦教學:《Oracle影片教學》
以上是oracle中merge into的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!