最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL實(shí)現(xiàn)merge?into四種方法代碼實(shí)例

 更新時(shí)間:2024年07月04日 10:18:37   作者:楠先生  
Merge?into是一個(gè)數(shù)據(jù)庫操作術(shù)語,通常用于將兩個(gè)或多個(gè)表中的數(shù)據(jù)合并到一個(gè)表中,這篇文章主要給大家介紹了關(guān)于MySQL實(shí)現(xiàn)merge?into四種方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

Mysql 8.x 版本引入了 MERGE INTO 語法

Merge 語句的基本語法:

MERGE INTO target_table USING source_table ON condition
WHEN MATCHED THEN
    UPDATE SET column1 = value1, column2 = value2, ...
WHEN NOT MATCHED THEN
    INSERT (column1, column2, ...) VALUES (value1, value2, ...);
  • target_table: 要更新或插入數(shù)據(jù)的目標(biāo)表。
  • source_table: 包含要合并數(shù)據(jù)的來源表。
  • condition: 指定用于匹配目標(biāo)表和來源表數(shù)據(jù)的條件。
  • WHEN MATCHED: 當(dāng)目標(biāo)表和來源表數(shù)據(jù)匹配時(shí),執(zhí)行的更新操作。
  • WHEN NOT MATCHED: 當(dāng)目標(biāo)表和來源表數(shù)據(jù)不匹配時(shí),執(zhí)行的插入操作。

本文主要介紹將oracle中的merge into轉(zhuǎn)換成MySQL的語法

在Oracle中,可以使用merge into,但是,MySQL中不支持,可以使用以下幾種方法。

方法一:update + insert

merge其實(shí)就是不存在則insert,存在則update,所以可以把它拆分成:

update ... where exist(select 1 from ... where 條件)

insert .... where not exist(select 1 from ... where 條件)

先介紹where exists的用法

1.where exists

(1)介紹

exists和in都有過濾功能,他倆最大的差別就是in引導(dǎo)的子句只能對(duì)一個(gè)字段進(jìn)行限制,比如

對(duì)id字段進(jìn)行限定
select * from A where  sid in (1,2,3)

但是如果我們想對(duì)多個(gè)字段進(jìn)行限制,使用in就不合適了,例如

select * from A where (sid,tid) in (select sid,tid from B)
不過很可惜,上面的語句只能再DB2上執(zhí)行,SQL Server不行

此時(shí)就可以使用exists 來對(duì)多個(gè)字段進(jìn)行限制了

select * from A where exists (select 1 from B where A.sid=B.sid and A.tid=B.tid)

(2)原理

exists做為where條件時(shí),是先對(duì)where 前的主查詢詢進(jìn)行查詢,然后用主查詢的結(jié)果一個(gè)一個(gè)的代入exists的查詢進(jìn)行判斷,如果為真則輸出當(dāng)前這一條主查詢的結(jié)果,否則不輸出。

查詢時(shí),一般情況下,子查詢會(huì)分成兩種情況:

1.子查詢與外表的字段有關(guān)系時(shí)

select * from A where exists (select 1 from B where A.sid=B.sid and A.tid=B.tid)

它先執(zhí)行A表的查詢,再將查詢結(jié)果一條一條放到B表的條件中去查詢,如果存在,則顯示此條

2.子查詢與外表的字段沒有任何關(guān)聯(lián)

select * from A where exists (select * from B where B.id=‘條件‘)

在這種情況下,只要子查詢的條件成立,就會(huì)查詢出表1中的所有記錄,反之,如果子查詢中沒有查詢到記錄,則表1不會(huì)查詢出任何的記錄。

以上兩種方式本質(zhì)上都是對(duì)A表查詢進(jìn)行過濾

2、update + insert

此種替代方式較為靈活,表可以無主鍵,自定義匹配規(guī)則。

注意:使用insert的時(shí)候需要加where not exists(select 1 from 表明 where 條件),防止重復(fù)插入

insert可以不加 where exists

方法二:replace into

 語法同insert into,使用簡單,但有限制, replace into是根據(jù)主鍵去匹配,故replace into的表必須有主鍵,常用于單表更新新增。

REPLACE的運(yùn)行與INSERT很相似。只有一點(diǎn)例外,假如表中的一個(gè)舊記錄與一個(gè)用于PRIMARY KEY或一個(gè)UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除 !刪除 !

所以還需要你有刪除數(shù)據(jù)的權(quán)限。

注意,除非表有一個(gè)PRIMARY KEY或UNIQUE索引,否則,使用一個(gè)REPLACE語句沒有意義。該語句會(huì)與INSERT相同,因?yàn)闆]有索引被用于確定是否新行復(fù)制了其它的行。

需要注意的問題就是replace into的時(shí)候會(huì)刪除老記錄。如果表中有一個(gè)自增的主鍵,那么就要出問題了。

方法三:on duplicate key update

在MYSQL中有語句 insert into ... on duplicate key update...

INSERT INTO table (id, name, age) values (1, 'yourname', 18) 
ON DUPLICATE KEY UPDATE name='yourname', age=18;

id字段是主鍵或者UNIQUE索引。上述語句的作用是:

如果id = 1這條記錄是不存在的,那么執(zhí)行INSERT INTO語句。

如果id = 1在數(shù)據(jù)庫中是存在的,那么執(zhí)行UPDATE命令,此時(shí)這條語句相當(dāng)于:

UPDATE table SET name='yourname', age=18 WHERE id=1; 

再如果 age 字段也是UNIQUE的,相當(dāng)于

UPDATE table SET name='yourname' WHERE id=1 OR age=18 LIMIT 1; 

執(zhí)行UPDATE語句的條件是INSERT語句的執(zhí)行會(huì)造成唯一鍵的重復(fù)。

通常,應(yīng)該盡量避免對(duì)帶有多個(gè)唯一關(guān)鍵字的表使用ON DUPLICATE KEY子句。

還可以這樣寫:

INSERT INTO table 
    (SELECT id, 'hisname' as name FROM table WHERE id >= 3)
ON DUPLICATE KEY UPDATE name=VALUES(name);

這種方法還可以用來批量執(zhí)行UPDATE操作(因?yàn)閱螚lUPDATE語句只能執(zhí)行一種update操作)

方法四:創(chuàng)建存儲(chǔ)過程

CREATE PROCEDURE name()
 
if exists(select 1 from 表 where ID = @ID)
begin
   UPDATE 表 SET XX= XX WHERE ID = @ID
end
else
begin
   INSERT 表 VALUES(XX...) 
end

總結(jié) 

到此這篇關(guān)于MySQL實(shí)現(xiàn)merge into四種方法的文章就介紹到這了,更多相關(guān)MySQL實(shí)現(xiàn)merge into內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中in條件使用字符串方式

    mysql中in條件使用字符串方式

    這篇文章主要介紹了mysql中in條件使用字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • mysql刪除操作其實(shí)是假刪除問題

    mysql刪除操作其實(shí)是假刪除問題

    這篇文章主要介紹了mysql刪除操作其實(shí)是假刪除問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL服務(wù)啟動(dòng)與停止的實(shí)現(xiàn)方式

    MySQL服務(wù)啟動(dòng)與停止的實(shí)現(xiàn)方式

    這篇文章主要介紹了MySQL服務(wù)啟動(dòng)與停止的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • mysql中的limit用法有哪些(推薦)

    mysql中的limit用法有哪些(推薦)

    在我們使用查詢語句的時(shí)候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個(gè)時(shí)候怎么辦呢,mysql已經(jīng)為我們提供了這樣一個(gè)功能,盡管語法邏輯很是怪異,這個(gè)功能就好比oracle里的rownum,但比mysql提供的這個(gè)LIMIT好用、好記和好理解多了,具體內(nèi)容一起通過本文看看吧
    2017-10-10
  • mysql添加enum類型的字段實(shí)現(xiàn)

    mysql添加enum類型的字段實(shí)現(xiàn)

    Enum類型它允許我們在一個(gè)有限的選項(xiàng)列表中選擇一個(gè)值,本文主要介紹了mysql添加enum類型的字段實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • mysql獲取隨機(jī)數(shù)據(jù)的方法

    mysql獲取隨機(jī)數(shù)據(jù)的方法

    在mysql中獲取隨機(jī)數(shù)據(jù)方法很簡單只要使用order by rand()即可了,但是如果你是百萬級(jí)數(shù)據(jù)量,使用order by rand()獲取隨機(jī)數(shù)據(jù)你會(huì)等死去,下面我來介紹具體的解決辦法
    2013-11-11
  • MYSQL日志與備份還原問題詳解

    MYSQL日志與備份還原問題詳解

    這篇文章主要為大家詳細(xì)介紹了MYSQL日志與備份還原問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • MySQL數(shù)據(jù)庫CRUD、常見函數(shù)及union查詢詳解

    MySQL數(shù)據(jù)庫CRUD、常見函數(shù)及union查詢詳解

    在MySQL中CRUD是指對(duì)數(shù)據(jù)庫進(jìn)行增加(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete)這四種基本操作的縮寫,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫CRUD、常見函數(shù)及union查詢的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • MySQL去重該使用distinct還是group by?

    MySQL去重該使用distinct還是group by?

    這篇文章主要介紹了MySQL去重該使用distinct還是group by,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • mysql中數(shù)據(jù)庫與數(shù)據(jù)表編碼格式的查看、創(chuàng)建及修改

    mysql中數(shù)據(jù)庫與數(shù)據(jù)表編碼格式的查看、創(chuàng)建及修改

    這篇文章給大家介紹了如何查看、創(chuàng)建以及修改數(shù)據(jù)庫與數(shù)據(jù)表的編碼格式,另外還給大家分享了添加和刪除外鍵的示例代碼,文中介紹的很詳細(xì),對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11

最新評(píng)論

资兴市| 永和县| 邛崃市| 抚顺县| 两当县| 南皮县| 新余市| 朝阳区| 广汉市| 屏南县| 潞城市| 凤凰县| 九台市| 眉山市| 准格尔旗| 铜山县| 工布江达县| 潮安县| 麦盖提县| 沙田区| 大埔县| 蓝田县| 梅河口市| 平江县| 周口市| 鲁山县| 芒康县| 房产| 新巴尔虎右旗| 贵州省| 来宾市| 南安市| 中阳县| 莲花县| 鄂托克前旗| 淅川县| 宁河县| 霍林郭勒市| 陈巴尔虎旗| 阿克陶县| 左贡县|