Wenn Sie ein Upgrade auf Postgresql 9.5 durchführen können, ist der jsonb_set
Befehl verfügbar, wie bereits erwähnt.
In jeder der folgenden SQL-Anweisungen habe ich die where
Klausel der Kürze halber weggelassen . Natürlich möchten Sie das wieder hinzufügen.
Name aktualisieren:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Ersetzen Sie die Tags (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"');
Fügen Sie ein Tag hinzu ( dies funktioniert, solange weniger als 999 Tags vorhanden sind . Wenn Sie das Argument 999 auf 1000 oder höher ändern, wird ein Fehler generiert . Dies scheint in Postgres 9.5.3 nicht mehr der Fall zu sein. Es kann ein viel größerer Index 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}'
Komplexes Update (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 jedem dieser Beispiele kein einzelnes Feld der JSON-Daten aktualisieren. Stattdessen erstellen Sie eine temporäre, geänderte Version der Daten und weisen diese geänderte Version wieder der Spalte zu. In der Praxis sollte das Ergebnis das gleiche sein, aber wenn Sie dies berücksichtigen, sollten komplexe Aktualisierungen wie im letzten Beispiel verständlicher werden.
In dem komplexen Beispiel gibt es drei Transformationen und drei temporäre Versionen: Erstens wird das letzte Tag entfernt. Diese Version wird dann durch Hinzufügen eines neuen Tags transformiert. Als nächstes wird die zweite Version durch Ändern des name
Feldes transformiert . Der Wert in der data
Spalte wird durch die endgültige Version ersetzt.