Hvis du er i stand til at opgradere til Postgresql 9.5, kan jsonb_set
kommandoen er tilgængelig, som andre har nævnt.
I hver af de følgende SQL-sætninger har jeg udeladt where
klausul for korthed; selvfølgelig vil du gerne tilføje det igen.
Opdater navn:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Udskift tags (i modsætning til at tilføje eller fjerne tags):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Udskiftning af det andet tag (0-indekseret):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Tilføj et tag (dette vil virke, så længe der er færre end 999 tags; ændring af argument 999 til 1000 eller derover genererer en fejl . Dette ser ikke længere ud til at være tilfældet i Postgres 9.5.3; et meget større indeks kan bruges):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Fjern det sidste mærke:
UPDATE test SET data = data #- '{tags,-1}'
Kompleks opdatering (slet det sidste tag, indsæt et nyt tag, og skift navn):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Det er vigtigt at bemærke, at i hvert af disse eksempler opdaterer du faktisk ikke et enkelt felt af JSON-dataene. I stedet opretter du en midlertidig, ændret version af dataene og tildeler den ændrede version tilbage til kolonnen. I praksis bør resultatet være det samme, men at holde dette i tankerne bør gøre komplekse opdateringer, som det sidste eksempel, mere forståelige.
I det komplekse eksempel er der tre transformationer og tre midlertidige versioner:Først fjernes det sidste tag. Derefter transformeres den version ved at tilføje et nyt tag. Dernæst transformeres den anden version ved at ændre name
Mark. Værdien i data
kolonne erstattes med den endelige version.