一般情況下,我們可以很簡單的利用 Limit
語法在進行資料異動中限制影響範圍。
1
|
UPDATE my_table SET my_col = 'data' LIMIT 2;
|
但是涉及使用子查詢的情境時,這招便不管用了。
例如今天資料長這樣:
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 |
+--------+--------+
|
我想要更新前面兩種資料,也就是要下 Limit 2
,但是 number 一樣的話就要一起更新,所以 number 為 1 和 2 的資料應該都要 update,所以預期應該要有 4 筆記錄被更新。第一直覺是利用 子查詢應該可以做到:
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
語法放到第三層子查詢(子查詢中的子查詢)就好了!
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