Om du kan uppgradera till Postgresql 9.5, jsonb_set
kommandot är tillgängligt, som andra har nämnt.
I var och en av följande SQL-satser har jag utelämnat where
klausul för korthet; självklart vill du lägga till det igen.
Uppdatera namn:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Ersätt taggarna (i motsats till att lägga till eller ta bort taggar):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Ersätter den andra taggen (0-indexerad):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Lägg till en tagg (detta fungerar så länge det finns färre än 999 taggar; ändra argument 999 till 1000 eller högre genererar ett fel . Detta verkar inte längre vara fallet i Postgres 9.5.3; ett mycket större index kan användas):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Ta bort den sista taggen:
UPDATE test SET data = data #- '{tags,-1}'
Komplex uppdatering (ta bort den sista taggen, infoga en ny tagg och ändra namnet):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Det är viktigt att notera att i vart och ett av dessa exempel uppdaterar du faktiskt inte ett enda fält av JSON-data. Istället skapar du en tillfällig, modifierad version av data och tilldelar den ändrade versionen tillbaka till kolumnen. I praktiken bör resultatet bli detsamma, men att ha detta i åtanke bör göra komplexa uppdateringar, som det förra exemplet, mer begripliga.
I det komplexa exemplet finns det tre transformationer och tre temporära versioner:Först tas den sista taggen bort. Sedan omvandlas den versionen genom att lägga till en ny tagg. Därefter transformeras den andra versionen genom att ändra name
fält. Värdet i data
kolumnen ersätts med den slutliga versionen.