在oracle中,“merge into”用于更新表中的數(shù)據(jù),可以將一個表中的數(shù)據(jù)插入另一個表中,若被插入的表中已經(jīng)有該數(shù)據(jù)則更新該數(shù)據(jù),若沒有該數(shù)據(jù)則會在被插入的表中新增數(shù)據(jù)。
本教程操作環(huán)境:Windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。
oracle中merge into的用法是什么
Oracle9g引入了MERGE命令,你能夠在一個sql語句中對一個表同時執(zhí)行inserts和update操作. MERGE命令從一個或多個數(shù)據(jù)源中選擇行來update或insert到一個或多個表.在Oracle 10g中MERGE有如下一些改進(jìn):
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標(biāo)表中,不需要連接源表和目標(biāo)表
4、UPDATE子句后面可以跟delete子句來去除一些不需要的行
5、源表就是using關(guān)鍵字后面跟的表,目標(biāo)表就是將要被merge into的表
6、merge into 中所有的update、insert、delete都是針對目標(biāo)表來操作的。由于merge into已經(jīng)制定了操作的表,所以update、insert、delete都不需要再顯示指出表名
7、總之,merge into的作用就是 解決用B表跟新A表數(shù)據(jù),如果A表中沒有,則把B表的數(shù)據(jù)插入A表或向一個表中插入數(shù)據(jù),如果該表已有該數(shù)據(jù)則更新,反之新增數(shù)據(jù)。
語法:
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 ! ]
接下來我們來直接進(jìn)行測試:
需求一:向一個表中插入一條數(shù)據(jù),如果該表中已經(jīng)有該數(shù)據(jù)則更新,反之新增
首先創(chuàng)建一個表TEST_ONE
create table TEST_ONE( ID NUMBER not null primary key, NAME VARCHAR2(255), IP VARCHAR2(255), MEMO VARCHAR2(255))commit;
隨便添加幾條數(shù)據(jù)作為測試數(shù)據(jù)
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');
好了,我們的數(shù)據(jù)表已經(jīng)建成,如下圖:
如果我們需要新增一條數(shù)據(jù),一般會這樣進(jìn)行
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (5, 'mrhu', '127.0.0.1.0', '王先生的IP');
但我們希望可以先用ID進(jìn)行判斷,沒有該數(shù)據(jù)新增,有該數(shù)據(jù)更新,怎么實現(xiàn)呢?
那么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);
運行如下:
我們再來看看表中數(shù)據(jù):
數(shù)據(jù)新增成功!
那么我們?nèi)绾螠y試更新呢?很簡單,我們將memo=‘王先生的IP’ 改為 memo=‘本大美女的IP’來進(jìn)行測試
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);
運行如下:
我們再來看看表中數(shù)據(jù):
數(shù)據(jù)更新成功啦!
需求二:將A表中的數(shù)據(jù)添加到B表中,要求通過主鍵來進(jìn)行判斷,如果包含該數(shù)據(jù)則更新,反之新增
我們再創(chuàng)建一個表TEST_TWO作為表B,TEST_ONE作為表A
create table tes( ID NUMBER not null primary key, CODE VARCHAR2(255), MEMO VARCHAR2(255));commit;
好了 表TEST_TWO建立好了,我們先來添加一條數(shù)據(jù)吧!
INSERT INTO ROOT.TEST_TWO (ID, CODE, MEMO) VALUES (5, 'mrhu', '隔壁老王的IP');
我們再看看TEST_TWO中的數(shù)據(jù):
我們來將TEST_ONE中的數(shù)據(jù)導(dǎo)到我們新建的表中,通過分析,我們發(fā)現(xiàn),TEST_TWO 表中有了一條數(shù)據(jù),ID為5,TEST_ONE中也有一條ID為5的數(shù)據(jù),預(yù)期執(zhí)行效果為TEST_TWOID為5的數(shù)據(jù)的memo字段值將更新為TEST_ONE中的‘本大美女的IP’,其他值進(jìn)行新增操作。
我們寫代碼來驗證一下:
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);
我們來看看效果:
執(zhí)行結(jié)果與預(yù)期結(jié)果一致,好了,merge into的用法你們學(xué)會了嗎! 喜歡的關(guān)注支持一下!
推薦教程:《Oracle視頻教程》