PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách thực hiện thao tác cập nhật trên các cột kiểu JSONB trong Postgres 9.4

Nếu bạn có thể nâng cấp lên Postgresql 9.5, jsonb_set lệnh có sẵn, như những người khác đã đề cập.

Trong mỗi câu lệnh SQL sau, tôi đã bỏ qua where mệnh đề ngắn gọn; rõ ràng là bạn muốn thêm nó trở 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 các thẻ):

UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');

Thay thế thẻ thứ hai (được lập chỉ mục 0):

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ẻ; việc thay đổi đối số 999 thành 1000 hoặc cao hơn sẽ tạo ra lỗi . Điều này dường như không còn xảy ra trong Postgres 9.5.3; một 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 dữ liệu JSON. Thay vào đó, bạn đang tạo phiên bản tạm thời, được sửa đổi của dữ liệu và gán lại phiên bản đã sửa đổi đó cho cột. Trên thực tế, kết quả sẽ giống nhau, nhưng hãy ghi nhớ điều này sẽ giúp 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 phép 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 tên name đồng ruộng. Giá trị trong data được thay thế bằng phiên bản cuối cùng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để lưu trữ PostgreSQL jsonb bằng SpringBoot + JPA?

  2. Dấu thời gian postgres now () không thay đổi khi tập lệnh hoạt động

  3. Sự cố khi chèn bằng psycopg

  4. Chọn hàng ngẫu nhiên từ bảng PostgreSQL với xác suất hàng có trọng số

  5. Xác định OID của một bảng trong Postgres 9.1?