CSV轉SQL轉換器(生成INSERT語句)
將CSV檔案轉換為SQL的INSERT語句和CREATE TABLE語句。支援MySQL、PostgreSQL、SQLite三種方言,並自動判定列的型別(整數・小數・字串)。轉換處理完全在瀏覽器內完成,資料不會發送到伺服器。
| 分隔符 |
|
|---|---|
| 將第一行作為表頭 | |
| 表名 | |
| SQL方言 |
|
| 同時生成CREATE TABLE語句 | |
| 將空值視為NULL | |
| 將多行合併為一條INSERT語句 |
輸入CSV資料後,生成的SQL語句將顯示在此處。
CSV行與INSERT語句的對應關係
| CSV的一行 | name,age,city |
|---|---|
| 轉換後的INSERT語句 | INSERT INTO `my_table` (`name`, `age`, `city`) VALUES ('Alice', 30, 'Tokyo'); |
將第一行作為表頭時,第二行及以後的每一行都會轉換為一條指定了表頭列名的INSERT語句。被判定為整數或小數的列會以不帶引號的數值形式輸出,其餘列則以單引號括起的字串形式輸出。
關於CSV轉SQL轉換器(生成INSERT語句)
手邊有一份CSV想匯入資料庫時,逐行手寫INSERT語句既費時又容易出錯。這款工具會讀取CSV,將每一行自動轉換成INSERT語句。列的型別是透過掃描所有資料行判定整數、小數或字串,因此還能一併生成CREATE TABLE語句,不必自己另外定義欄位型別。
工具支援MySQL、PostgreSQL、SQLite三種SQL方言,切換方言時,識別符的引號字元與型別名稱會自動對應調整。值裡若含有單引號,也會依SQL標準自動轉義,產生的語句可以直接執行。整個轉換過程都在瀏覽器內完成,CSV內容不會傳送到任何伺服器,可放心處理含真實資料的檔案。
產生INSERT語句的操作步驟
- 貼上CSV資料 將CSV內容貼到輸入欄。若資料是以Tab分隔,記得把分隔符改為製表符。
- 設定表名與方言 輸入要匯入的表名,並選擇資料庫使用的SQL方言,識別符的引號字元會自動切換。
- 選擇輸出選項 決定是否同時生成CREATE TABLE語句、是否將空值視為NULL,以及是否將多行合併為一條INSERT語句。
- 複製並執行 複製產生的SQL,貼到資料庫用戶端執行。若資料量龐大,建議分批執行。
用好本工具的小技巧
- 列的型別(整數・小數・字串)通過檢查該列所有資料行的值自動判定。只要有一個值不是數字,整列都會被視為字串型別。
- 啟用"將多行合併為一條INSERT語句"後,會生成 `INSERT INTO ... VALUES (...), (...), (...);` 這樣的單條語句,可減少匯入大量資料時的執行次數。
- MySQL使用反引號(`)括住表名和列名,而PostgreSQL和SQLite使用雙引號("),選擇的SQL方言不同,引號字元會自動切換。
- 關閉"將空值視為NULL"後,字串型別的列會輸出為空字串(''),數值型別的列則會輸出為NULL。
CSV轉SQL轉換器的應用場景
準備測試用的種子資料
把試算表整理好的測試資料直接轉成INSERT語句,適合不需要動用框架seeder的小規模驗證。
遷移主檔資料
將舊系統匯出的CSV轉換成可匯入新資料庫的格式,同時取得對應的CREATE TABLE語句。
檢查列的型別
透過自動判定的型別,能及早發現混入非預期值的欄位。原本該是數值的列若被判定為字串型別,就是資料異常的訊號。
比較不同方言的語法差異
用同一份CSV切換不同方言,就能實際比較識別符引號與型別名稱的差異。
匯入SQL相關術語
- INSERT語句
- 用來向表中新增一行資料的SQL指令,會將列名與對應的值一一指定。
- CREATE TABLE語句
- 用來新建一張表的SQL指令,需定義列名與型別。若目標表尚未存在,就需要先執行這條語句。
- SQL方言
- 不同資料庫產品之間的語法差異,例如包住識別符的符號、型別名稱的寫法都可能不同。
- NULL
- 表示「值不存在」的特殊狀態,與空字串是兩回事,因此需要另外決定空值該如何處理。
- 轉義(escape)
- 讓具有特殊語法意義的字元被當成普通字元處理的做法,本工具主要用於處理值中出現的單引號。
- 批次插入
- 將多行資料合併在同一條INSERT語句中一次匯入的方式,能減少語句解析與提交的次數,執行速度更快。
常見問題
閒話 ― 為什麼說合並後的INSERT語句更"快"
本工具可生成的"將多行合併為一條INSERT語句"(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)在執行速度上,通常比逐行發出單獨的INSERT語句要快得多。這是因為它減少了資料庫解析每條SQL語句、生成執行計劃的開銷,以及每條語句都要重複一次事務提交所產生的成本。
不過,MySQL存在 `max_allowed_packet` 限制,PostgreSQL也有類似的通訊緩衝區上限,如果將過多的行塞進一條INSERT語句中,可能會超出該上限而導致錯誤。實際工作中,通常會將語句按每幾百到幾千行進行拆分。
將CSV檔案匯入測試資料庫的工作,在開發現場常被稱為"準備種子資料(seeding)",許多Web框架(例如Laravel的seeder和factory)都為此專門提供了機制,可見這是一項非常常見的任務。像本工具這樣的轉換工具,在無需搭建那套完整機制的小規模驗證或資料遷移場景中,仍然是一種方便快捷的手段。