SQL JSON INSERT 插入資料

在學會如何查詢與修改 JSON 之前,最基礎的步驟就是將 JSON 資料正確地存入資料庫。本章將深入探討如何透過多種方式執行 JSON 資料的插入,並說明其中的細節與常見陷阱。

直接插入 JSON 字串

最簡單的方式是將完全符合 JSON 規範的字串直接存入 JSON 型態的欄位。

基本範例

假設我們有一張 users 資料表,其中的 profile 欄位型態定義為 JSON

INSERT INTO users (name, profile) 
VALUES ('Mike', '{"city": "Taipei", "age": 25, "tags": ["SQL", "Web"]}');

當你執行這條語句時,資料庫會執行以下操作:

  1. 語法解析:檢查字串是否符合標準 JSON 格式。
  2. 型態轉換:將字串轉化為內部二進位格式儲存。
  3. 自動排序:在某些資料庫如 MySQL 中,存入的物件鍵值會依字母順序重新排序以便優化查詢。
格式錯誤會導致失敗: 如果你傳入了錯誤的 JSON 格式(例如:{'city': 'Taipei'},注意 JSON 標準規定必須使用雙引號),資料庫會拋出錯誤並拒絕插入。這是 JSON 型態與 TEXT 型態最大的區別:它具備強大的輸入驗證。

使用建構子函數插入 (Constructor Functions)

手寫長字串容易出錯,尤其是當 JSON 中包含動態變數或需要處理大量轉義字元時。使用 SQL 內建函數能讓程式碼更具可讀性且更安全。

使用 JSON_OBJECT()

這是一個最推薦的動態組裝方式。它會自動處理字串轉義,確保產出的 JSON 一定合法。

-- 混合使用常數與資料變數
INSERT INTO users (name, profile) 
VALUES (
    'Jane', 
    JSON_OBJECT(
        'city', 'Kaohsiung', 
        'age', 30, 
        'is_premium', TRUE,
        'created_at', NOW()
    )
);

使用 JSON_ARRAY()

如果你的欄位是用來存一組清單(例如文章標籤、產品顏色),使用 JSON_ARRAY 非常方便。

INSERT INTO products (title, colors) 
VALUES ('經典連帽衫', JSON_ARRAY('Red', 'Blue', 'Green'));
-- 存入結果: ["Red", "Blue", "Green"]

處理轉義字元 (Handling Escaping)

當你要插入的字串內容包含單引號或特殊符號時,直接拼湊字串會非常痛苦:

  • 傳統方式:需要手動處理 I''m a developer
  • 函數方式JSON_OBJECT('bio', 'I''m a developer')。建構子函數會自動幫你封裝好,你只需要注意 SQL 層級的單引號轉義即可。

從現有資料表轉存 JSON

有時候我們需要將舊有的關係型資料轉換成 JSON 整合到新系統中。你可以結合 SELECT 語句:

-- 將舊表的欄位直接打包成 JSON 存入新表
INSERT INTO archive_table (id, old_data_json)
SELECT 
    id, 
    JSON_OBJECT('old_v1_email', email, 'old_v1_phone', phone)
FROM legacy_users;

常見問題與最佳實踐

JSON 欄位 vs TEXT 欄位

雖然你也可以把 JSON 存進 TEXT 欄位,但我們強烈建議使用原生 JSON 型態:

  • 空間優化:二進位儲存通常更省空間。
  • 查詢速度:原生型態支援快速定位 Key,不需要掃描整個字串。
  • 資料完整性:內建格式驗證,防止「髒資料」進入資料庫。

效能小預知

執行 INSERT 時,校驗 JSON 格式會稍微增加一點 CPU 負擔,但在後續的 SELECTUPDATE 階段,這點代碼轉換的代價將會換來倍數增長的讀取效能。

總結

  1. 手寫字串:適用於靜態且結構簡單的資料,但請務必檢查雙引號格式。
  2. 動態組裝:優先選用 JSON_OBJECT()JSON_ARRAY()
  3. 批次處理:善用 JSON_ARRAYAGG 或結合 SELECT 進行大量資料轉換。