網頁

2025年7月17日 星期四

[教學] MySQL 如何匯入大型 SQL 資料檔?利用 EmEditor 分割檔案與 phpMyAdmin 匯入實戰

在網站維運的過程中,資料庫的備份與還原是家常便飯。但當資料庫成長到一定規模時,單純的匯出匯入就可能變成一場惡夢。這次,我們將分享一個處理大型 MySQL 資料庫(超過 1GB)的實戰經驗,特別是在有資源限制的虛擬主機環境(如 GoDaddy)中,如何巧妙地完成匯入工作。

前言:我們遇到的挑戰

我的部落格 bestdaylong.com 架設在 GoDaddy 的虛擬主機上,其提供的 MySQL 資料庫有 1GB 的容量上限。隨著資料日積月累,資料庫也即將觸頂,因此需要將歷史資料備份到其他地方。

我遇到的主要問題如下:

  1. 檔案過大:完整的 SQL 匯出檔超過 1GB。

  2. phpMyAdmin 限制:直接使用 phpMyAdmin 的匯入功能,會因為檔案過大及執行時間過長而導致連線逾時(Timeout),無法成功匯入。

  3. MySQL Workbench 速度緩慢:嘗試使用官方的 MySQL Workbench 工具進行資料匯入,雖然可行,但速度非常慢,且進度回饋不明顯,難以掌握狀況。

面對這些挑戰,最終的解決方案是:分割大法

核心概念:化整為零

既然單一的大檔案無法處理,那我們就將它分割成數個小檔案。最好的分割方式是依據資料的特性,例如以「年份」為單位,將一個巨大的 SQL 檔,拆分成 2015.sql2016.sql2017.sql... 等多個小檔案,再逐一進行匯入。

所需工具

  1. EmEditor:處理大型文字檔的神器。一般的文字編輯器(如 EditPlus、Notepad++)在開啟 GB 等級的檔案時可能會崩潰或沒有回應,而 EmEditor 能輕鬆應對。

  2. phpMyAdmin:虛擬主機最常見的網頁版資料庫管理工具,用來匯入分割後的小檔案。

  3. MySQL Workbench(選用):一個功能強大的本地端資料庫管理工具,在本次任務中,主要用來「監控」匯入進度。


操作步驟教學

步驟一:使用 EmEditor 開啟並篩選資料

首先,我們需要從巨大的 SQL 檔中,篩選出我們想要處理的資料表內容。在我的案例中,我想處理的是 Stock(股票資料)這張表。

  1. 用 EmEditor 開啟你巨大的 .sql 檔案。

  2. 使用 EmEditor 的篩選(或搜尋)功能,輸入 INSERT INTOStockVALUES。這會將檔案中所有與 Stock 資料表相關的插入語法全部顯示出來。

  3. 將篩選出的所有內容(Ctrl+A 全選)複製,並貼到一個新的 EmEditor 檔案中,將其另存為 stock_all.sql。這樣我們就有了一個只包含股票資料的 SQL 檔。

步驟二:依年份分割成小檔案

現在我們有了 stock_all.sql,接著要將它依年份分割。

  1. 在 stock_all.sql 檔案中,再次使用篩選功能。

  2. 例如,我想分離出 2017 年的資料,就在篩選框中輸入 2017-

  3. EmEditor 會即時篩選出所有包含 "2017-" 的資料行。

  4. 將篩選出的結果全選、複製,然後貼到一個新的檔案,並命名為 stock_2017.sql

  5. 重複此步驟,建立出 stock_2018.sqlstock_2019.sql 等檔案。

經過這個步驟,原本超過 1GB 的大檔案,就被我們成功拆解成數個幾 MB 到幾十 MB 的小檔案,為後續匯入鋪平了道路。

步驟三:透過 phpMyAdmin 匯入分割後的檔案

這是最關鍵的一步。因為檔案已經變小,phpMyAdmin 的匯入功能就能派上用場了,而且速度飛快!

  1. 登入你的 phpMyAdmin

  2. 選擇目標資料庫,並點進 Stock 資料表。

  3. 點擊頂端的 「匯入 (Import)」 頁籤。

  4. 點擊「選擇檔案」,選擇你剛剛分割好的其中一個檔案,例如 stock_2019.sql

  5. 確認設定無誤後,點擊右下角的 「執行 (Go)」

由於檔案不大,通常在幾秒到幾十秒內就能完成匯入。

步驟四(進階技巧):使用 MySQL Workbench 監控進度

phpMyAdmin 在執行匯入時,頁面會處於處理中狀態,我們無法得知確切的進度。這時,MySQL Workbench 就成了我們的監控利器。

  1. 在 phpMyAdmin 開始匯入的同時,開啟 MySQL Workbench 並連線到同一個資料庫。

  2. 在查詢視窗中,執行以下 SQL 語法來查看最新的資料:

    Generated sql
    SELECT * FROM stock0331.Stock 
    WHERE year(StockDate) = 2019 
    ORDER BY StockDate DESC;
  3. 你可以每隔幾秒鐘就重新執行一次查詢。你會發現資料筆數不斷增加,日期也不斷更新,這代表 phpMyAdmin 正在背景順利地匯入資料。透過這個方法,即使網頁沒有回饋,我們也能安心地掌握進度。

結論

處理大型資料庫的匯入問題,關鍵在於「化整為零」。MySQL Workbench 雖然功能強大,但在某些虛擬主機環境下的批次匯入效能不佳。反而是透過 EmEditor 這種專業級文字編輯器進行檔案分割,再利用主機商提供的標準工具 phpMyAdmin 進行匯入,成為了最高效、最可靠的解決方案。

希望這次的實戰分享,能幫助到遇到同樣問題的朋友!


原始操作影片參考


 


2025年7月16日 星期三

AppSheet 教學:利用試算表公式 (VLOOKUP) 打造彈性的會議簽到系統

在今天的 AppSheet 教學中,我們將探討一個非常實用且強大的功能:如何在 App 中直接使用 Google Sheets (或 Excel) 的試算表公式。我們將透過一個「會議簽到系統」的範例,來展示如何利用 VLOOKUP 函數,實現一個更具彈性的資料連動應用。

應用情境

想像一個常見的會議簽到情境:

  1. 公司有多場會議,每場會議都需要記錄出席人員。

  2. 員工擁有自己的員工編號,簽到時只需輸入或掃描員工編號即可。

  3. 系統需要根據輸入的員工編號,自動帶出員工的姓名。

最大的挑戰是:如果一位新進員工或臨時與會者,他的資料還沒被預先建立在「人員資料表」中,該怎麼辦?我們希望他仍然可以先用編號簽到,等到事後補上資料時,簽到記錄上的姓名能自動更新。

這就是今天要介紹的 Spreadsheet formula 功能的絕佳應用場景。

基礎設定:三張資料表

首先,我們在 Google Sheets 中建立三張基礎資料表:

  1. 會議 (Meetings): 用於建立不同的會議場次。

    • 會議編號 (Key)

    • 會議名稱

    • 會議修改時間

  2. 人員 (Personnel): 存放所有員工的基本資料。

    • 人員編號 (Key)

    • 人員名稱

  3. 簽到表 (Sign-in List): 記錄每場會議的簽到狀況。

    • 簽到表編號 (Key)

    • 會議編號 (Ref 類型,關聯至「會議」表)

    • 人員編號 (簽到時手動輸入的欄位)

    • 人員名稱 (我們希望此欄位自動帶出)

    • 簽到時間

核心步驟:設定 Spreadsheet Formula

我們的目標是在「簽到表」中,當輸入 人員編號 後,人員名稱 欄位能自動從「人員」表中查找並填入對應的姓名。

  1. 在 AppSheet 編輯器中,進入 Data > Columns,並選擇 簽到表

  2. 找到 人員名稱 這個欄位,點擊左側的鉛筆圖示進入編輯模式。

  3. 展開 Auto Compute 區塊,你會看到幾個選項。我們要使用的是 Spreadsheet formula

  4. 在這個欄位中,輸入你在 Google Sheets 中會使用的 VLOOKUP 公式。假設在試算表中,「人員編號」在 C 欄,「人員名稱」在 D 欄,而「人員」資料表的編號和姓名分別在 B 欄和 C 欄,你的公式會像這樣:

    Generated excel
    =VLOOKUP(C2, '人員'!B:C, 2, 0)
    • C2: 要查找的值 (當前這一筆簽到記錄的 人員編號)。

    • '人員'!B:C: 要查找的範圍 (在「人員」工作表的 B 到 C 欄)。

    • 2: 找到後,回傳範圍中的第 2 個欄位的值 (也就是 人員名稱)。

    • 0: 表示需要精確匹配。

    將這個公式貼到 Spreadsheet formula 欄位中。

  5. 儲存設定。AppSheet 會自動將這個公式轉換為它內部使用的 R1C1 格式,例如:vlookup(RC[-1],'人員'!C[-2]:C[-1],2,0)。這表示它會根據欄位的相對位置來計算,更加穩健。

實際操作與問題排解

現在讓我們來看看實際操作時會發生什麼,以及如何解決可能遇到的問題。

情境一:簽到時,人員已存在

如果我們簽到時輸入的 人員編號 (例如 A001) 已經存在於「人員」表中,AppSheet 會在同步後,觸發試算表公式,人員名稱 ("張三") 會被正確地帶出來。

情境二:簽到時,人員不存在 (核心展示)

  1. 臨時簽到: 我們在簽到 App 中新增一筆記錄,會議選擇「臨時會」,人員編號 輸入一個不存在的 A005。儲存後,你會發現 人員名稱 欄位是空的。

  2. 事後補登資料: 我們到「人員」管理介面,新增一筆資料:人員編號 為 A005人員名稱 為「路人甲」。

  3. 同步與更新: 儲存後,再次查看「臨時會」的簽到記錄。神奇的事情發生了!A005 旁邊的 人員名稱 自動更新為「路人甲」。

這就是 Spreadsheet formula 的威力。它不是在 AppSheet 端計算,而是在資料寫回 Google Sheets 時,將公式一併寫入儲存格。因此,只要試算表端的源頭資料(「人員」表)有變動,所有引用到它的公式(「簽到表」中的 VLOOKUP)都會自動重新計算。

常見問題與解決方案:公式沒有生效?

在影片中,我們也遇到了一個常見的狀況:當我們修改了資料表的結構(例如新增或刪除欄位),有時會導致 Spreadsheet formula 失效或抓到錯誤的欄位。

當你發現公式沒有如預期般運作時,可以這麼做:

  1. 檢查 Google Sheet: 直接打開後端的 Google Sheet,看看公式是否正確寫入,或者是否出現了 #N/A 或 #REF! 等錯誤。這能幫助你判斷問題是出在公式本身還是 AppSheet 的設定。

  2. 重新產生結構 (Regenerate Structure): 這是最重要的一步。當你變更了試算表的欄位結構後,必須告訴 AppSheet 重新讀取一次。

    • 回到 AppSheet 編輯器 Data > Columns

    • 選擇你修改過的資料表(例如 簽到表)。

    • 點擊右上方的 Regenerate Structure 按鈕。

    • AppSheet 會重新掃描你的試算表結構,並修正欄位對應關係。

    這個動作通常能解決因為欄位變動而導致的公式錯誤。

總結

今天我們學習了如何在 AppSheet 中利用 Spreadsheet formula 來執行試算表原生公式,它帶來了幾個好處:

  • 彈性極高: 可以在資料輸入後,根據其他資料表的變化動態更新內容。

  • 功能強大: 能運用 Google Sheets 中所有你熟悉的複雜公式,而不僅限於 AppSheet 內建的表達式。

  • 除錯直觀:可以直接在 Google Sheets 中看到公式的計算結果與錯誤訊息。

下次當你需要類似「先記錄,後更新」的應用場景時,不妨試試這個強大的功能!