Переместить все данные в отдельный столбец при редактировании строки - PullRequest
1 голос
/ 02 апреля 2020

Например, у меня есть таблица с именем Users. Он имеет 32 столбца. Мне нужно добавить новый столбец данных с типом jsonb и переместить все данные в этот столбец. Также мне нужно изменить данные в столбце «Данные», если какой-либо столбец «Пользователи» был изменен.

Например, я создаю новую строку: name = "Test", age = 43, country = "Moon" ... Все это данные должны быть в столбце данных. Я могу изменить страну на «Марсе», в этом случае столбец «Данные» тоже должен быть изменен.

Как реализовать в postgresql?

1 Ответ

1 голос
/ 02 апреля 2020

Читая ваш вопрос и комментарии, я не вижу причин для репликации данных как 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 Я решаю аналогичную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...