Wie führe ich Update-Operationen für Spalten vom Typ JSONB in Postgres 9.4 durch?
Suche durch die Dokumentation bei der Postgres 9.4 Datentyp JSONB, es ist nicht sofort offensichtlich, wie ich mit den updates auf JSONB Spalten.
Dokumentation für JSONB-Typen und Funktionen:
http://www.postgresql.org/docs/9.4/static/functions-json.html
http://www.postgresql.org/docs/9.4/static/datatype-json.html
Als Beispiele habe ich diese grundlegenden Tabellenstruktur:
CREATE TABLE test(id serial, data jsonb);
Einfügen ist einfach, wie in:
INSERT INTO test(data) values ('{"name": "my-name", "tags": ["tag1", "tag2"]}');
Nun, wie würde ich ein update der 'Daten' - Spalte? Das ist ungültige syntax:
UPDATE test SET data->'name' = 'my-other-name' WHERE id = 1;
Ist dies irgendwo dokumentiert klar, dass ich das verpasst? Danke.
InformationsquelleAutor der Frage jvous | 2014-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ideal, die Sie nicht verwenden JSON-Dokumente für Daten, die Sie verwalten möchten, innerhalb einer relationalen Datenbank. Verwenden Sie eine normalisierten relationalen design statt.
JSON ist in Erster Linie zum speichern von ganzen Dokumente, die nicht bearbeitet werden müssen innerhalb des RDBMS. Related:
Aktualisieren einer Zeile in die Postgres schreibt immer eine neue version des ganze Zeile. Das ist das Grundprinzip von Postgres' MVCC-Modell. Aus performance-Sicht ist es kaum wichtig, ob Sie ändern eine einzelne Stück von Daten in ein JSON-Objekt oder alle: eine neue version der Zeile geschrieben werden muss.
Damit die Beratung in der Bedienungsanleitung:
Den Kern von ihm: ändern alles innen ein JSON-Objekt, die Sie zuordnen müssen, um ein geändertes Objekt auf die Spalte. Postgres versorgt beschränkten Mitteln zu bauen und zu manipulieren
json
Daten zusätzlich, um seine Speicher-Fähigkeiten. Das arsenal der Werkzeuge erheblich gewachsen ist, mit jedem neuen release seit version 9.2. Aber das wichtigste bleibt: Sie immer zuordnen müssen, um einen kompletten, modifizierten Objekt auf die Spalte und Postgres schreibt immer eine neue Zeile version für ein update.Einige Techniken, wie das arbeiten mit den tools von Postgres 9.3 oder höher:
InformationsquelleAutor der Antwort Erwin Brandstetter
Wenn Sie sind in der Lage, ein upgrade auf Postgresql 9.5, die
jsonb_set
Befehl verfügbar ist, wie andere erwähnt haben.In jeder der Folgen von SQL-Anweisungen, habe ich es unterlassen die
where
- Klausel für die Kürze; offenbar würden Sie hinzufügen möchten, zurück.Update name:
Ersetzen der tags (im Gegensatz zum hinzufügen oder entfernen von tags):
Ersetzen Sie den zweiten tag (0-indiziert):
Anhängen a-tag (
dies wird funktionieren, solange es weniger als 999 tags; ändern argument 999 1000 oder höher, wird ein Fehler generiert. Dies ist nicht mehr der Fall zu sein scheint, die in Postgres 9.5.3; einen viel größeren index verwendet werden kann):Entfernen Sie den letzten tag:
Komplex aktualisieren (löschen Sie den letzten tag, fügen Sie einen neuen tag, und ändern Sie den Namen):
Es ist wichtig zu beachten, dass in jedem dieser Beispiele, Sie sind nicht wirklich zu aktualisieren ein einzelnes Feld der JSON-Daten. Stattdessen erstellen Sie eine temporäre, modifizierte version der Daten und zum zuweisen dieser modifizierten version zurück in die Spalte. In der Praxis sollte das Ergebnis das gleiche, aber in diesem Sinne sollten komplexe updates, wie das Letzte Beispiel, verständlicher.
In der komplexen Beispiel gibt es drei Transformationen und drei temporäre Versionen: Zuerst, der Letzte tag entfernt wird. Dann, dass die version umgewandelt wird, indem ein neuer tag". Weiter, die zweite version ist verwandelt durch die änderung der
name
Feld. Der Wert in derdata
Spalte ersetzt wird mit der finalen version.InformationsquelleAutor der Antwort Jimothy
Kommt, 9.5 in form von jsonb_set von Andrew Dunstan basierend auf einer vorhandenen Erweiterung jsonbxdas funktioniert mit 9,4
InformationsquelleAutor der Antwort philofinfinitejest
Diese Frage wurde im Rahmen der PostgreSQL-9.4,
aber neue Zuschauer kommen zu dieser Frage sollten sich bewusst sein, dass in postgres 9.5,
sub-Dokument-Erstellen/Update/Delete-Operationen auf JSONB Felder werden nativ unterstützt von der Datenbank, ohne die Notwendigkeit für die Erweiterung der Funktionen.
Finden Sie unter: JSONB ändern von Operatoren und Funktionen
InformationsquelleAutor der Antwort bguiz
Für diejenigen, die sich mit diesem Thema und wollen einen sehr schnellen fix (und sind fest auf 9.4.5 oder früher), hier ist was ich getan habe:
Erstellung von test-Tabelle
Update-Anweisung zum ändern der Namen von jsonb Eigenschaft
Letztlich ist die akzeptierte Antwort ist richtig, dass Sie nicht ändern können, ein individuelles Stück des jsonb-Objekt (9.4.5 oder früher); Sie können jedoch wandeln Sie die jsonb-Objekt in eine Zeichenfolge (::TEXT) und Bearbeiten Sie die Zeichenfolge und warf Sie zurück auf die jsonb-Objekt (::jsonb).
Es gibt zwei wichtige Vorbehalte
Mit dieser sagte, ich kam in eine situation, wo ich hatte, um das schema zu aktualisieren für content in der jsonb Objekte und das war der einfachste Weg, um zu erreichen, genau das, was das ursprüngliche Plakat bat.
InformationsquelleAutor der Antwort Chad Capra
Schrieb ich kleine Funktion für mich, die rekursiv arbeitet in Postgres 9.4. Ich hatte dasselbe problem (gute Taten Sie lösen einige dieser Kopfschmerzen in Postgres 9.5).
Egal, hier ist die Funktion (ich hoffe, es funktioniert gut für Sie):
Hier ist Beispiel verwenden:
Wie Sie sehen, es analysieren tief und aktualisieren/Werte hinzufügen, falls erforderlich.
InformationsquelleAutor der Antwort J. Raczkiewicz
Matheus de Oliveira erstellt praktische Funktionen für JSON CRUD-Operationen in postgresql. Sie können importiert werden, mithilfe der \i-Richtlinie. Beachten Sie die jsonb Gabel von den Funktionen wenn jsonb, wenn Ihre Daten geben.
9.3 json https://gist.github.com/matheusoliveira/9488951
9.4 jsonb https://gist.github.com/inindev/2219dff96851928c2282
InformationsquelleAutor der Antwort John Clark
Vielleicht:
UPDATE test SET Daten = "my-other-name"'::json WHERE id = 1;
Funktionierte es mit meinem Fall, wo die Daten aus einer json-Typ
InformationsquelleAutor der Antwort Gianluigi Sartori