Also, JSONB in PostgreSQL ist ein mächtiges Tool, um komplexe, hierarchische Datenstrukturen zu speichern. Aber was, wenn du einen Wert in einer JSONB-Spalte ändern willst? Zum Beispiel die Telefonnummer eines Users ersetzen oder eine neue Kategorie zu einem Array hinzufügen? Klingt easy, aber JSONB ist halt keine Tabelle, wo du einfach einen Wert in einer Zelle änderst. Um Daten in einem JSON-Objekt zu aktualisieren, brauchen wir spezielle Funktionen. Heute sind die Hauptdarsteller:
jsonb_set(): um einen Wert an einem bestimmten "Pfad" zu ändern oder hinzuzufügen.jsonb_insert(): um ein neues Element in ein JSON-Array einzufügen.
Daten aktualisieren mit jsonb_set()
Die Funktion jsonb_set() erlaubt es dir, einen Teil eines JSONB-Objekts zu ändern oder neue Keys und Werte hinzuzufügen.
Allgemeine Syntax
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
target— unser JSONB-Objekt, das wir aktualisieren wollen.path— ein Array von Strings, das den Pfad zum Key angibt, den du ändern willst.new_value— der Wert, den wir hinzufügen oder ersetzen wollen.create_missing— ein boolescher Parameter (TRUE oder FALSE), der angibt, ob fehlende Keys erstellt werden sollen.
Schauen wir uns ein einfaches Beispiel an. Stell dir vor, wir haben eine Tabelle users mit einer Spalte profile vom Typ JSONB, wo die Profile der User gespeichert sind. Einer der User aktualisiert seine Telefonnummer. Wie machen wir das?
-- Tabelle erstellen und Daten hinzufügen
CREATE TABLE users (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');
-- Telefonnummer aktualisieren
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;
-- Ergebnis checken
SELECT profile FROM users WHERE id = 1;
Ergebnis:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
}
}
Nice! Wir haben die Telefonnummer geändert! Beachte, der Pfad zum Key wird als Array von Strings angegeben: '{contact,phone}'.
Neuen Key hinzufügen
Falls der Key, den du ändern willst, nicht existiert, kannst du den Parameter create_missing = TRUE nutzen, um ihn zu erstellen:
UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlin"', TRUE)
WHERE id = 1;
-- Ergebnis checken
SELECT profile FROM users WHERE id = 1;
Ergebnis:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
}
}
Jetzt haben wir einen neuen Abschnitt mit der Adresse. Praktisch, oder?
Daten einfügen mit jsonb_insert()
Die Funktion jsonb_insert() wird genutzt, um Elemente in Arrays innerhalb von JSONB-Objekten einzufügen.
Allgemeine Syntax
jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
target— das Ziel-JSONB-Objekt.path— ein Array von Strings, das den Pfad zum Array angibt, in das du Elemente einfügen willst.new_value— der Wert, der hinzugefügt werden soll.insert_after— ein boolescher Parameter. Wenn FALSE, wird das Element vor dem angegebenen Index eingefügt; wenn TRUE — danach.
Hier ein Beispiel. Angenommen, wir haben eine Tabelle, in der in der Spalte profile eine Liste von Interessen des Users gespeichert ist. Wir wollen ein neues Interesse zum Array hinzufügen:
-- Daten für das Beispiel hinzufügen
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["sport", "musik"]', TRUE)
WHERE id = 1;
-- Neues Interesse "programmierung" am Anfang der Liste einfügen
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programmierung"', FALSE)
WHERE id = 1;
-- Ergebnis checken
SELECT profile FROM users WHERE id = 1;
Ergebnis:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
},
"interests": [
"programmierung",
"sport",
"musik"
]
}
Typische Probleme und wie du sie vermeidest
Mit jsonb_set() und jsonb_insert() zu arbeiten kann ein bisschen tricky sein, wenn du Folgendes nicht beachtest:
- Falscher Pfad zum Key. Wenn du einen falschen Pfad angibst oder versuchst, ein nicht existierendes Element ohne
create_missing=TRUEzu aktualisieren, bekommst du einen Fehler oder es passiert einfach nix. Check immer die Struktur deines JSON. - Falscher Datentyp. Denk dran, dass
new_valuevom Typ JSONB sein muss. Wenn du einen String einfügen willst, pack ihn unbedingt in doppelte Anführungszeichen ('"wert"'). - Daten überschreiben. Wenn du versuchst, ein Array ohne die passenden Funktionen zu aktualisieren, kannst du aus Versehen alte Daten löschen. Nutze
jsonb_insert()für sicheres Hinzufügen von neuen Elementen.
Beispiel für einen Fehler:
-- Fehler: falscher Pfad
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"neuer kontakt"', FALSE)
WHERE id = 1;
Das führt zu einem Fehler, weil im Objekt profile kein Key contacts existiert und create_missing auf FALSE steht.
So vermeidest du das:
-- create_missing = TRUE angeben
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"neuer kontakt"', TRUE)
WHERE id = 1;
Wo wird das im echten Leben genutzt?
Mit JSONB zu arbeiten ist nicht nur Spielerei, sondern ein superwichtiger Skill für viele moderne Anwendungen. Hier ein paar echte Beispiele:
- User-Einstellungen speichern. JSONB ist perfekt für dynamische Datenstrukturen wie App-Einstellungen, die bei jedem User anders aussehen können.
- Integration mit externen APIs. JSONB ist praktisch, um Rohdaten aus REST APIs zu speichern, die JSON-Objekte zurückgeben.
- Big Data Analyse. Verschachtelte JSON-Strukturen machen es einfach, mit IoT-Daten, Logs oder Analytics zu arbeiten.
Damit ist unser kleiner Einstieg ins Aktualisieren von JSON-Objekten vorbei. Jetzt weißt du, wie du in JSONB einfügst, aktualisierst und Daten hinzufügst – und wie du typische Fehler vermeidest. In der nächsten Vorlesung lernst du, wie du JSONB-Objekte zusammenführst und noch effizienter damit arbeitest!
GO TO FULL VERSION