Wenn Sie ein Upgrade auf Postgresql 9.5 durchführen können, wird die Datei jsonb_set
Befehl ist verfügbar, wie andere bereits erwähnt haben.
In jeder der folgenden SQL-Anweisungen habe ich das where
weggelassen Klausel für die Kürze; offensichtlich möchten Sie das wieder hinzufügen.
Name aktualisieren:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Tags ersetzen (im Gegensatz zum Hinzufügen oder Entfernen von Tags):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Ersetzen des zweiten Tags (0-indiziert):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Hängen Sie ein Tag an (dies funktioniert, solange es weniger als 999 Tags gibt; das Ändern des Arguments 999 auf 1000 oder höher erzeugt einen Fehler . Dies scheint in Postgres 9.5.3 nicht mehr der Fall zu sein; ein viel größerer Index kann verwendet werden):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Entfernen Sie das letzte Tag:
UPDATE test SET data = data #- '{tags,-1}'
Komplexe Aktualisierung (löschen Sie das letzte Tag, fügen Sie ein neues Tag ein und ändern Sie den Namen):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Es ist wichtig zu beachten, dass Sie in keinem dieser Beispiele tatsächlich ein einzelnes Feld der JSON-Daten aktualisieren. Stattdessen erstellen Sie eine temporäre, modifizierte Version der Daten und weisen diese modifizierte Version wieder der Spalte zu. In der Praxis sollte das Ergebnis dasselbe sein, aber wenn Sie dies im Hinterkopf behalten, sollten komplexe Aktualisierungen, wie das letzte Beispiel, verständlicher werden.
Im komplexen Beispiel gibt es drei Transformationen und drei temporäre Versionen:Zuerst wird das letzte Tag entfernt. Dann wird diese Version transformiert, indem ein neues Tag hinzugefügt wird. Als nächstes wird die zweite Version transformiert, indem der name
geändert wird Feld. Der Wert in den data
Spalte wird durch die endgültige Version ersetzt.