Читая ваш вопрос и комментарии, я не вижу причин для репликации данных как JSON в отдельном столбце. Вам лучше сгенерировать эти данные по требованию.
Но если по каким-то другим причинам действительно необходимо реплицировать данные, вы можете создать TRIGGER
, который обновит ваш новый столбец после INSERT
и UPDATE
, например
Тестовая таблица:
CREATE TEMPORARY TABLE t (name text, age int, country text);
Добавление нового столбца json:
ALTER TABLE t ADD COLUMN summary json;
Функция обновления json колонка:
CREATE OR REPLACE FUNCTION update_summary() RETURNS trigger AS
$BODY$
BEGIN
NEW.summary = json_build_object('name',NEW.name,
'age',NEW.age,
'country',NEW.country);
RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql';
Триггер для выполнения функции
CREATE TRIGGER check_summary BEFORE INSERT OR UPDATE ON t
FOR EACH ROW EXECUTE PROCEDURE update_summary();
Тестирование INSERT
и UPDATE
:
INSERT INTO t VALUES ('test',43,'Moon');
SELECT summary FROM t;
summary
---------------------------------------------------
{"name" : "test", "age" : 43, "country" : "Moon"}
(1 Zeile)
UPDATE t SET country = 'Mars' WHERE name = 'test';
SELECT summary FROM t;
summary
---------------------------------------------------
{"name" : "test", "age" : 43, "country" : "Mars"}
(1 Zeile)
В этом другом answer
Я решаю аналогичную проблему.