CodeGym /Các khóa học /SQL SELF /Cập nhật dữ liệu trong các đối tượng JSON bằng jso...

Cập nhật dữ liệu trong các đối tượng JSON bằng jsonb_set()jsonb_insert()

SQL SELF
Mức độ , Bài học
Có sẵn

Ok, JSONB trong PostgreSQL là một công cụ cực mạnh để lưu trữ các cấu trúc dữ liệu phức tạp, dạng cây. Nhưng nếu bạn cần cập nhật giá trị bên trong một cột JSONB thì sao? Ví dụ, thay đổi số điện thoại của user hoặc thêm một category mới vào mảng? Nghe thì đơn giản, nhưng JSONB không phải là bảng, bạn không thể sửa trực tiếp một ô như bình thường. Để cập nhật dữ liệu trong đối tượng JSON, tụi mình sẽ dùng các hàm đặc biệt. Hôm nay hai nhân vật chính là:

  • jsonb_set(): để sửa hoặc thêm giá trị theo "đường dẫn" chỉ định.
  • jsonb_insert(): để chèn phần tử mới vào mảng JSON.

Cập nhật dữ liệu với jsonb_set()

Hàm jsonb_set() cho phép bạn sửa một phần của đối tượng JSONB hoặc thêm key và value mới vào đó.

Cú pháp tổng quát

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — đối tượng JSONB mà bạn muốn cập nhật.
  • path — mảng chuỗi, đại diện cho đường dẫn đến key bạn muốn sửa.
  • new_value — giá trị bạn muốn thêm hoặc thay thế.
  • create_missing — tham số boolean (TRUE hoặc FALSE), cho biết có tạo key còn thiếu không.

Cùng xem ví dụ đơn giản nhé. Giả sử bạn có bảng users với cột profile kiểu JSONB, lưu profile của user. Một user muốn cập nhật số điện thoại. Làm sao nhỉ?

-- Tạo bảng và thêm dữ liệu
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');

-- Cập nhật số điện thoại
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Kiểm tra kết quả
SELECT profile FROM users WHERE id = 1;

Kết quả:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

Wow! Đã đổi số điện thoại rồi nhé! Lưu ý, đường dẫn đến key được truyền qua mảng chuỗi '{contact,phone}'.

Thêm key mới

Nếu key bạn muốn cập nhật chưa tồn tại, bạn có thể dùng tham số create_missing = TRUE để tạo nó luôn:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlin"', TRUE)
WHERE id = 1;

-- Kiểm tra kết quả
SELECT profile FROM users WHERE id = 1;

Kết quả:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlin"
  }
}

Bây giờ có thêm mục địa chỉ rồi. Tiện ghê ha?

Chèn dữ liệu với jsonb_insert()

Hàm jsonb_insert() dùng để thêm phần tử vào mảng bên trong đối tượng JSONB.

Cú pháp tổng quát

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — đối tượng JSONB mục tiêu.
  • path — mảng chuỗi, chỉ đường dẫn đến mảng bạn muốn chèn phần tử.
  • new_value — giá trị cần thêm vào.
  • insert_after — tham số boolean. Nếu FALSE, phần tử sẽ được chèn trước chỉ số chỉ định; nếu TRUE thì sau.

Lấy ví dụ nhé. Giả sử bạn có bảng với cột profile lưu danh sách sở thích của user. Bạn muốn thêm sở thích mới vào mảng:

-- Thêm dữ liệu ví dụ
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["the thao", "am nhac"]', TRUE)
WHERE id = 1;

-- Chèn sở thích mới "lap trinh" vào đầu danh sách
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"lap trinh"', FALSE)
WHERE id = 1;

-- Kiểm tra kết quả
SELECT profile FROM users WHERE id = 1;

Kết quả:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlin"
  },
  "interests": [
    "lap trinh",
    "the thao",
    "am nhac"
  ]
}

Những vấn đề thường gặp và cách tránh

Làm việc với jsonb_set()jsonb_insert() đôi khi hơi tricky nếu bạn không chú ý mấy điểm sau:

  1. Sai đường dẫn đến key. Nếu bạn truyền sai đường dẫn hoặc cố cập nhật phần tử không tồn tại mà không có create_missing=TRUE, sẽ bị lỗi hoặc không thay đổi gì cả. Luôn kiểm tra cấu trúc JSON của bạn nhé.
  2. Sai kiểu dữ liệu. Nhớ là new_value phải là kiểu JSONB. Nếu muốn chèn chuỗi, phải để trong dấu nháy kép ('"gia tri"').
  3. Ghi đè dữ liệu. Nếu bạn cập nhật mảng mà không dùng đúng hàm, có thể xóa nhầm dữ liệu cũ. Hãy dùng jsonb_insert() để thêm phần tử mới cho an toàn.

Ví dụ lỗi:

-- Lỗi: sai đường dẫn
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"lien he moi"', FALSE)
WHERE id = 1;

Cái này sẽ báo lỗi vì trong đối tượng profile không có key contacts, mà create_missing lại là FALSE.

Cách tránh:

-- Đặt create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"lien he moi"', TRUE)
WHERE id = 1;

Ứng dụng thực tế ở đâu?

Làm việc với JSONB không chỉ là cho vui đâu, mà là kỹ năng cực kỳ quan trọng cho nhiều ứng dụng hiện đại. Đây là vài ví dụ thực tế:

  • Lưu trữ cài đặt người dùng. JSONB cực hợp cho các cấu trúc dữ liệu động như cài đặt app, mỗi user một kiểu.
  • Tích hợp với API ngoài. JSONB tiện để lưu dữ liệu thô từ REST API trả về các đối tượng JSON.
  • Phân tích dữ liệu lớn. Cấu trúc JSON lồng nhau giúp xử lý dữ liệu IoT, log hoặc analytics rất ngon.

Vậy là xong phần nhập môn cập nhật đối tượng JSON rồi nhé. Giờ bạn đã biết cách chèn, cập nhật và thêm dữ liệu vào JSONB, cũng như tránh lỗi thường gặp. Bài sau tụi mình sẽ học cách merge các đối tượng JSONB và làm việc với chúng hiệu quả hơn nữa!

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Xử lý dữ liệu JSON
Xử lý dữ liệu JSON
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION