在撰寫 JavaScript 時,常會利用迴圈來做取出陣列內的物件,再進行一些操作。原先是想利用這樣的原理來產出固定的 SQL 語句進而執行,不過遇上了效能瓶頸。後來發現其實轉個念頭,其實並不一定要在 SQL 中使用迴圈。
內容
情境
1. 當選取 A 資料表取得資料後,將選取出來的結果逐筆取出對應欄位的資料
2. 取出的每筆資料作為新增到 B 資料表的一部分
若用 JavaScript 執行的話,概念上會像是這樣:
1 2 3 4 5 6 7 8 |
const dataFromTableA = [{name: 'NameA', age: 32, id:1},{name: 'NameB', age: 12, id:2}] for(let i=0; i<dataFromTableA.length; i++){ let sqlScript = "" /*產出對應的 sql 語法*/ sqlScript += `Insert Info tableB (columnA, name, age) Values(valueA, ${dataFromTableA.name}, ${dataFromTableA.age})` await /*執行 sqlScript */ } |
不過若照上述這樣執行,會遇上效能瓶頸,要應付千萬級的資料,並不是個好方法。
若把上述情境改用 Sub Query 來做,也就變成 Insert 語法執行時,有一些資料是參考另一張資料表的內容即可
1 2 3 |
INSERT INTO db.userNew (`change_time`, `user`, `age`) SELECT unix_timestamp(), user, age FROM db.user userOld |
參考資料
1. MySQL How do you INSERT INTO a table with a SELECT subquery returning multiple rows?
2. 子查詢 (SQL Subquery)