PostgreSQL 11.5 каскадное обновление нескольких столбцов одной строки - PullRequest
0 голосов
/ 28 октября 2019

У меня есть одна таблица с именем device_statistics, она хранит информацию об устройстве одного приложения, сценарий создания таблицы:

CREATE TABLE public.device_statistics
(
    id character varying(255) COLLATE pg_catalog."default" NOT NULL,
    abnormalcount integer,
    appid character varying(32) COLLATE pg_catalog."default" NOT NULL,
    inactivecount integer,
    offlinecount integer,
    onlinecount integer,
    statisticstime date,
    totalcount integer,
    CONSTRAINT ods_device_statistics_pkey PRIMARY KEY (id)
)

когда устройство отключено, я должен обновить значение offlinecount, поскольку totalcount=abnormalcount + inactivecount + offlinecount + onlinecount такможно ли автоматически обновлять значение итоговой суммы при обновлении аварийной, неактивной, автономной или онлайн-учетной записи.

, например:

перед отключением устройства, строка выглядит так: (только показать, что нам нужно):

appid  offlinecount totalcount

test        10            32

когда устройство отключено и я обновляю значение offlinecount, я хочу следующую строку, например:

appid  offlinecount totalcount
test       9           31

значение totalcout - автоматическое обновление, как это сделать?

1 Ответ

0 голосов
/ 28 октября 2019

До PostgreSQL 12 вы могли бы вместо этого создать представление:

CREATE TABLE public.device_statistics
(
    id character varying(255) COLLATE pg_catalog."default" NOT NULL,
    abnormalcount integer,
    appid character varying(32) COLLATE pg_catalog."default" NOT NULL,
    inactivecount integer,
    offlinecount integer,
    onlinecount integer,
    statisticstime date,
    CONSTRAINT ods_device_statistics_pkey PRIMARY KEY (id)
)

CREATE OR REPLACE VIEW public.device_statistics_with_total AS
SELECT id,
       abnormalcount,
       appid,
       inactivecount,
       offlinecount,
       onlinecount,
       statisticstime,
       abnormalcount + inactivecount + offlinecount + onlinecount AS totalcount
FROM device_statistics;

Если вы можете позволить себе обновление до PostgreSQL v. 12, вы можете использовать новую функцию сгенерированных столбцов :

CREATE TABLE public.device_statistics
(
    id character varying(255) COLLATE pg_catalog."default" NOT NULL,
    abnormalcount integer,
    appid character varying(32) COLLATE pg_catalog."default" NOT NULL,
    inactivecount integer,
    offlinecount integer,
    onlinecount integer,
    statisticstime date,
    totalcount integer GENERATED ALWAYS AS (abnormalcount + inactivecount + offlinecount + onlinecount) STORED,
    CONSTRAINT ods_device_statistics_pkey PRIMARY KEY (id)
)

Раскрытие информации: я работаю на EnterpriseDB (EDB)

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