Nếu bạn có thể nâng cấp lên Postgresql 9.5, jsonb_set
lệnh sẽ khả dụng, như những người khác đã đề cập.
Trong mỗi câu lệnh SQL sau đây, tôi đã bỏ qua where
mệnh đề cho ngắn gọn; rõ ràng, bạn muốn thêm lại.
Cập nhật tên:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Thay thế các thẻ (trái ngược với việc thêm hoặc xóa thẻ):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Thay thế thẻ thứ hai (0-index):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Nối thẻ ( điều này sẽ hoạt động miễn là có ít hơn 999 thẻ; thay đổi đối số 999 thành 1000 trở lên sẽ gây ra lỗi . Điều này dường như không còn xảy ra trong Postgres 9.5.3; chỉ mục lớn hơn nhiều có thể được sử dụng) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Xóa thẻ cuối cùng:
UPDATE test SET data = data #- '{tags,-1}'
Cập nhật phức tạp (xóa thẻ cuối cùng, chèn thẻ mới và thay đổi tên):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Điều quan trọng cần lưu ý là trong mỗi ví dụ này, bạn không thực sự cập nhật một trường duy nhất của dữ liệu JSON. Thay vào đó, bạn đang tạo một phiên bản dữ liệu tạm thời, đã sửa đổi và gán phiên bản đã sửa đổi đó trở lại cột. Trong thực tế, kết quả nên giống nhau, nhưng ghi nhớ điều này sẽ tạo ra các cập nhật phức tạp, như ví dụ cuối cùng, dễ hiểu hơn.
Trong ví dụ phức tạp, có ba biến đổi và ba phiên bản tạm thời: Đầu tiên, thẻ cuối cùng bị xóa. Sau đó, phiên bản đó được chuyển đổi bằng cách thêm một thẻ mới. Tiếp theo, phiên bản thứ hai được chuyển đổi bằng cách thay đổi name
trường. Giá trị trong data
cột được thay thế bằng phiên bản cuối cùng.