Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การบันทึก JSON Array ลงใน MySQL ด้วยชนิดข้อมูล JSON

ตั้งแต่ MySQL 5.7+ รองรับชนิดข้อมูล JSON แบบ Native ซึ่งจัดเก็บในรูปแบบ Binary ที่ปรับปรุงแล้ว ทำให้ค้นหา, ดึงข้อมูล, และตรวจสอบความถูกต้องได้อย่างมีประสิทธิภาพ

ตัวอย่างการใช้งาน

สร้างตารางพร้อมคอลัมน์ JSON:

mysql> CREATE TABLE DemoTable1438 (
    -> EmployeeDetails JSON
    -> );

เพิ่มข้อมูล JSON Array:

mysql> INSERT INTO DemoTable1438 VALUES (
    -> '[{"EmployeeId":"EMP-101","EmployeeName":"Chris"},
    ->  {"EmployeeId":"EMP-102","EmployeeName":"David"},
    ->  {"EmployeeId":"EMP-103","EmployeeName":"Sam"}]'
    -> );

ดูข้อมูล (MySQL จะจัดรูปแบบ Pretty-print อัตโนมัติ):

mysql> SELECT * FROM DemoTable1438;
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EmployeeDetails                                                                                                                                            |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [{"EmployeeId": "EMP-101", "EmployeeName": "Chris"}, {"EmployeeId": "EMP-102", "EmployeeName": "David"}, {"EmployeeId": "EMP-103", "EmployeeName": "Sam"}] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+

ฟังก์ชัน JSON ที่ใช้บ่อย

ฟังก์ชันคำอธิบายตัวอย่าง
JSON_EXTRACT(col, path)ดึงค่าจาก JSONJSON_EXTRACT(EmployeeDetails, '$[0].EmployeeName') → "Chris"
->>Shortcut สำหรับ JSON_EXTRACT + UNQUOTEEmployeeDetails->>'$[0].EmployeeName'
JSON_CONTAINS(col, val, path)เช็คว่ามีค่าใน JSONJSON_CONTAINS(EmployeeDetails, '"EMP-101"', '$.EmployeeId')
JSON_ARRAY_APPEND()เพิ่มสมาชิกใน ArrayUPDATE t SET col = JSON_ARRAY_APPEND(col, '$', '{"id":"EMP-104"}')
JSON_ARRAY_INSERT()แทรกสมาชิกในตำแหน่งที่กำหนด
JSON_REMOVE()ลบสมาชิก
JSON_LENGTH(col, path)นับจำนวนสมาชิกJSON_LENGTH(EmployeeDetails) → 3

การสร้าง Index สำหรับ JSON (MySQL 8.0+)

ไม่สามารถสร้าง Index บนคอลัมน์ JSON โดยตรงได้ แต่สามารถสร้าง Generated Column แล้ว Index คอลัมน์นั้น:

ALTER TABLE DemoTable1438
    ADD COLUMN first_emp_id VARCHAR(20) GENERATED ALWAYS AS (EmployeeDetails->>'$[0].EmployeeId') STORED,
    ADD INDEX idx_first_emp_id (first_emp_id);

ข้อดีของ JSON Data Type

  • ตรวจสอบความถูกต้อง (Valid JSON) อัตโนมัติตอน INSERT/UPDATE
  • จัดเก็บแบบ Binary - เร็วกว่า TEXT/VARCHAR
  • ฟังก์ชัน JSON มากมายสำหรับ Query และ Manipulate
  • รองรับ Partial Update (ไม่ต้องเขียนทับทั้ง Document)

ข้อจำกัด

  • ไม่รองรับ Foreign Key โดยตรง
  • ไม่สามารถ Index โดยตรง (ต้องใช้ Generated Column)
  • ขนาดสูงสุด 1GB (ตัวแปร max_allowed_packet)