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語句。被判定為整數或小數的列會以不帶引號的數值形式輸出,其餘列則以單引號括起的字串形式輸出。

使用提示

  • 列的型別(整數・小數・字串)通過檢查該列所有資料行的值自動判定。只要有一個值不是數字,整列都會被視為字串型別。
  • 啟用"將多行合併為一條INSERT語句"後,會生成 `INSERT INTO ... VALUES (...), (...), (...);` 這樣的單條語句,可減少匯入大量資料時的執行次數。
  • MySQL使用反引號(`)括住表名和列名,而PostgreSQL和SQLite使用雙引號("),選擇的SQL方言不同,引號字元會自動切換。
  • 關閉"將空值視為NULL"後,字串型別的列會輸出為空字串(''),數值型別的列則會輸出為NULL。

常見問題

會檢查該列所有資料行的值:若全部為整數則判定為INTEGER型別,若全部為小數則判定為REAL型別,其餘情況(字串或混合)判定為TEXT型別。生成CREATE TABLE語句時會直接採用該判定結果作為列型別。

可以。在"SQL方言"中選擇PostgreSQL或SQLite後,表名・列名的引號(雙引號)和型別名會輸出為對應資料庫所遵循的格式。

按照SQL標準的轉義方式,單引號會自動轉換為兩個連續的單引號(''),因此生成的語句可以直接執行。

不會。所有轉換處理都在瀏覽器內的JavaScript中完成,您輸入的CSV內容不會被發送到任何伺服器。即使是包含實際資料的CSV,也可以放心使用。
ツールくん

閒話 ― 為什麼說合並後的INSERT語句更"快"

本工具可生成的"將多行合併為一條INSERT語句"(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)在執行速度上,通常比逐行發出單獨的INSERT語句要快得多。這是因為它減少了資料庫解析每條SQL語句、生成執行計劃的開銷,以及每條語句都要重複一次事務提交所產生的成本。

不過,MySQL存在 `max_allowed_packet` 限制,PostgreSQL也有類似的通訊緩衝區上限,如果將過多的行塞進一條INSERT語句中,可能會超出該上限而導致錯誤。實際工作中,通常會將語句按每幾百到幾千行進行拆分。

將CSV檔案匯入測試資料庫的工作,在開發現場常被稱為"準備種子資料(seeding)",許多Web框架(例如Laravel的seeder和factory)都為此專門提供了機制,可見這是一項非常常見的任務。像本工具這樣的轉換工具,在無需搭建那套完整機制的小規模驗證或資料遷移場景中,仍然是一種方便快捷的手段。