หากคุณสามารถอัปเกรดเป็น Postgresql 9.5 ได้jsonb_set
คำสั่งดังกล่าวจะพร้อมใช้งานตามที่คนอื่นกล่าวถึง
ในแต่ละคำสั่ง SQL ต่อไปนี้ฉันได้ละเว้นwhere
ประโยคสำหรับความกะทัดรัด เห็นได้ชัดว่าคุณต้องการเพิ่มกลับเข้าไป
ชื่ออัปเดต:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
แทนที่แท็ก (ตรงกันข้ามกับการเพิ่มหรือลบแท็ก):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
การแทนที่แท็กที่สอง (ดัชนี 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
ต่อท้ายแท็ก ( จะใช้ได้ตราบเท่าที่มีน้อยกว่า 999 แท็กการเปลี่ยนอาร์กิวเมนต์ 999 ถึง 1,000 ขึ้นไปจะทำให้เกิดข้อผิดพลาดซึ่งดูเหมือนจะไม่เป็นเช่นนั้นใน Postgres 9.5.3 อีกต่อไปสามารถใช้ดัชนีที่ใหญ่กว่านี้ได้มาก) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
ลบแท็กสุดท้าย:
UPDATE test SET data = data #- '{tags,-1}'
การอัปเดตที่ซับซ้อน (ลบแท็กสุดท้ายแทรกแท็กใหม่และเปลี่ยนชื่อ):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
โปรดทราบว่าในแต่ละตัวอย่างเหล่านี้คุณไม่ได้อัปเดตข้อมูล JSON เพียงช่องเดียว แต่คุณกำลังสร้างข้อมูลเวอร์ชันชั่วคราวที่แก้ไขแล้วและกำหนดเวอร์ชันที่แก้ไขนั้นกลับไปที่คอลัมน์ ในทางปฏิบัติผลลัพธ์ควรจะเหมือนกัน แต่การคำนึงถึงสิ่งนี้ควรทำการอัปเดตที่ซับซ้อนเช่นตัวอย่างสุดท้ายเพื่อให้เข้าใจได้มากขึ้น
ในตัวอย่างที่ซับซ้อนมีการเปลี่ยนแปลงสามแบบและเวอร์ชันชั่วคราวสามแบบ: อันดับแรกแท็กสุดท้ายจะถูกลบออก จากนั้นเวอร์ชันดังกล่าวจะถูกเปลี่ยนโดยการเพิ่มแท็กใหม่ ถัดไปเวอร์ชันที่สองจะถูกเปลี่ยนโดยการเปลี่ยนname
ฟิลด์ ค่าในdata
คอลัมน์จะถูกแทนที่ด้วยเวอร์ชันสุดท้าย