MySQL / MariaDB | Calos's Blog

2018/06/14

一般情況下,我們可以很簡單的利用 Limit 語法在進行資料異動中限制影響範圍。

MySQL
UPDATE `my_table` SET `my_col` = 'data' LIMIT 2;
1
UPDATE `my_table` SET `my_col` = 'data' LIMIT 2;

 

但是涉及使用子查詢的情境時,這招便不管用了。

例如今天資料長這樣:

+--------+--------+ | number | my_col | +--------+--------+ | 1 | a | | 1 | a | | 2 | b | | 2 | b | | 3 | c | | 3 | c | +--------+--------+
1
2
3
4
5
6
7
8
9
10
+--------+--------+
| number | my_col |
+--------+--------+
|      1 | a      |
|      1 | a      |
|      2 | b      |
|      2 | b      |
|      3 | c      |
|      3 | c      |
+--------+--------+

 

我想要 Update 前面兩種資料,也就是要下 Limit 2,但是 number 一樣的話就要一起 Update,所以 number 為 1 和 2 的 record 應該都要 Update,所以預期應該要有 4 筆 record 被 Update。直覺利用 Sub-Query 應該可以做到:

MySQL
UPDATE `my_table` SET `my_col` = 'data' WHERE `number` IN ( SELECT DISTINCT `number` FROM `my_table` LIMIT 2 );
1
2
3
UPDATE `my_table` SET `my_col` = 'data' WHERE `number` IN (
    SELECT DISTINCT `number` FROM `my_table` LIMIT 2
);

 

但是如果在 MariaDB/MySQL 5.5 或之後的版本執行時應該會得到 [Err] 1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

 

那這樣要怎麼辦呢?工具是死的,人是活的,Stackoverflow 就有人想到辦法繞過去了 。我們把 Limit 語法放到第三層子查詢(子查詢中的子查詢)就好了!

MySQL
UPDATE `my_table` SET `my_col` = 'data' WHERE `number` IN ( SELECT `number` FROM ( SELECT DISTINCT `number` FROM `my_table` LIMIT 2 ) as `sub_query_2` );
1
2
3
4
5
UPDATE `my_table` SET `my_col` = 'data' WHERE `number` IN (
    SELECT `number` FROM (
        SELECT DISTINCT `number` FROM `my_table` LIMIT 2
    ) as `sub_query_2`
);

 


Reference: MySQL – UPDATE query with LIMIT – Stack Overflow

[MariaDB/MySQL] 在 Update 子查詢中使用 Limit 限制影響範圍 was last modified: 2018-06-13 by Calos

本文由 Calos's Blog 提供 原文連結

立即按讚,感謝大大無私地分享
寫了282篇文章,獲得0
Line

熱門推薦

精彩推薦

既之前老貓的Blog通過中時部落格的嚴選優格 這次通過[Andyliu.Design]部落達人甄選! 😀 可以點上方的小貼址就可以連進去看了 (即) 很高興老貓的Blog又被肯定了 我也會盡量加油! 繼續寫 如果有什麼地方寫得不好的…...
之前一直很懶 到了現在才把Wordpress更新到2.3.2版本以及網址的設定 (雖然新版本一星期左右就要再出了 XD) 之前雖然輸入http://iqmore.tw/就可以進到本站 或者輸入http://iqmore.tw/blog/也可以進入 因為我都有設...
之前的網址比較長~在轉貼或記憶上比較不易 如 http://iqmore.tw/blog/iqmore/西元/月/日/篇數/ 現在全面更新成http://iqmore.tw/archives/篇數 所以如果有以前的連結 更改一下就ok了 也很抱歉造成大家的困擾 在此...
我經營本站的第一個想法就是想把自己碰過遇過用過的電腦相關東西都完整記錄下來 無論是自己發現的,或者是別人發現的都會想記錄下來 就算是別人已介紹過 我相信~ 透過不同人的介紹感覺就會有所不同 我還是會重新介...
老貓的Blog做名片嚕! 如果有廠商想要找我,上面就有我的連絡方式 這一次先印2盒試試 注意字是會亮的唷
嘿嘿… 因為沒有人一進來覺得走錯就關了吧… 😯 目前老貓的Blog以全新的面貌重新出發 拿掉了不必要的貼紙與廣告 不過目前廣告是參考其他前輩的作法融入於文章中 希望會有起色….我有兩個網站要養的說 😎 目前交換連...
車子牽到現在歷經 8 個月,里程突破了 10000 公里,按照原廠保養手冊的說明,每 10000 公里/每半年,或是發聲明顯的點火異常、引擎熄火、過熱等情況,就需要進行點火系統的保養。   雖然覺得對於新車來說,在 10...
若環境是Windows,請先安裝Git  產生一組新的SSH Key(如果已經有現成的,可跳過這步驟) # 切換到使用者家目錄 cd ~ # 產生ssh key ssh-keygen -t rsa -C "你的E-mail" # 這裡是指定key的擺放位置,直接Enter下去...
如果想要安裝一個套件 不想透過自行編譯或是手動下載 RPM 套件包進行安裝的話 但是系統預設的套件庫又找不到想要安裝的套件時 可以透過加入第三方套件庫來解決這個問題   在 CentOS 官方 WIKI  可以找到一些可信...
登入 Linux 時會執行 /etc/update-motd.d 下的腳本 所以想要觀看的話除了重新登入以外,以迴圈執行即可 for i in /etc/update-motd.d/*; do sudo $i; done 1 for i in /etc/update-motd.d/*; do sudo $i; done ...
則回覆