Jeśli możesz zaktualizować do Postgresql 9.5, jsonb_set
polecenie jest dostępne, jak wspominali inni.
W każdej z poniższych instrukcji SQL pominąłem where
klauzulę dotyczącą zwięzłości; oczywiście chciałbyś to dodać.
Nazwa aktualizacji:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Zastąp tagi (w przeciwieństwie do dodawania lub usuwania tagów):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Zastąpienie drugiego tagu (z indeksem 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Dołącz tag ( będzie działać, o ile będzie mniej niż 999 tagów; zmiana argumentu 999 na 1000 lub więcej generuje błąd . Wydaje się, że nie ma to już miejsca w Postgres 9.5.3; można użyć znacznie większego indeksu) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Usuń ostatni tag:
UPDATE test SET data = data #- '{tags,-1}'
Złożona aktualizacja (usuń ostatni tag, wstaw nowy tag i zmień nazwę):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Należy zauważyć, że w każdym z tych przykładów w rzeczywistości nie aktualizujesz ani jednego pola danych JSON. Zamiast tego tworzysz tymczasową, zmodyfikowaną wersję danych i przypisujesz tę zmodyfikowaną wersję z powrotem do kolumny. W praktyce wynik powinien być taki sam, ale pamiętanie o tym powinno sprawić, że złożone aktualizacje, takie jak ostatni przykład, będą bardziej zrozumiałe.
W złożonym przykładzie istnieją trzy transformacje i trzy wersje tymczasowe: Po pierwsze, ostatni tag jest usuwany. Następnie ta wersja jest przekształcana przez dodanie nowego tagu. Następnie druga wersja jest przekształcana poprzez zmianę name
pola. Wartość w data
kolumnie zostanie zastąpiona wersją ostateczną.