Als u kunt upgraden naar Postgresql 9.5, de jsonb_set
commando beschikbaar is, zoals anderen al hebben vermeld.
In elk van de volgende SQL-instructies heb ik de where
. weggelaten clausule voor de beknoptheid; natuurlijk wil je dat weer toevoegen.
Naam bijwerken:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Vervang de tags (in tegenstelling tot het toevoegen of verwijderen van tags):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
De tweede tag vervangen (0-geïndexeerd):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Voeg een tag toe (dit werkt zolang er minder dan 999 tags zijn; het wijzigen van argument 999 in 1000 of hoger genereert een fout . Dit lijkt niet langer het geval te zijn in Postgres 9.5.3; een veel grotere index kan worden gebruikt):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Verwijder de laatste tag:
UPDATE test SET data = data #- '{tags,-1}'
Complexe update (verwijder de laatste tag, voeg een nieuwe tag in en wijzig de naam):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Het is belangrijk op te merken dat u in elk van deze voorbeelden geen enkel veld van de JSON-gegevens bijwerkt. In plaats daarvan maakt u een tijdelijke, gewijzigde versie van de gegevens en wijst u die gewijzigde versie weer toe aan de kolom. In de praktijk zou het resultaat hetzelfde moeten zijn, maar dit in gedachten houden zou complexe updates, zoals het laatste voorbeeld, begrijpelijker moeten maken.
In het complexe voorbeeld zijn er drie transformaties en drie tijdelijke versies:Eerst wordt de laatste tag verwijderd. Vervolgens wordt die versie getransformeerd door een nieuwe tag toe te voegen. Vervolgens wordt de tweede versie getransformeerd door de name
. te veranderen veld. De waarde in de data
kolom wordt vervangen door de definitieve versie.