Генерируемы столбцы в Генерируемых столбцах
У меня есть база PostgreSQL:
Мне нужно чтобы столбец saldo_out вычислялся: saldo_in +(debit - kredit). Сначала я пытался сделать это триггером:
CREATE FUNCTION trigger_s_after_lns() RETURNS trigger AS $First$
BEGIN
UPDATE consolid SET saldo_out_som = ((SELECT saldo_in_som FROM consolid
WHERE code =
consolid.code)
+((SELECT debet FROM consolid WHERE code =
consolid.code) - (SELECT
kredit FROM consolid WHERE code = consolid.code)))
WHERE code = consolid.code;
UPDATE consolid SET saldo_out_usd =((SELECT saldo_in_usd FROM consolid WHERE
code = consolid.code)
+((SELECT debit_usd FROM consolid WHERE code
= consolid.code) -
(SELECT credit_usd FROM consolid WHERE code = consolid.code)))
WHERE code = consolid.code;
RETURN UPDATE;
END;
$First$
LANGUAGE plpgsql;
CREATE TRIGGER consolid
AFTER UPDATE ON consolid FOR EACH ROW
EXECUTE PROCEDURE trigger_s_after_lns();
Но, триггер выдает ошибку:
подзапрос в выражении вернул больше одной строки.
Затем я решил создать генерируемый столбец, но поле difference уже создан как генерируемый столбец с полем saldo_out, и создавать генерируемый столбец в генерируемом столбце нельзя..
Можно ли это как то обойти, или может мне исправить триггер?
Вот так создается таблица:
CREATE TABLE public.consolid
(
code character varying(50) COLLATE pg_catalog."default",
category character varying(500) COLLATE pg_catalog."default",
additional_score character varying(50) COLLATE pg_catalog."default",
name_score character varying(500) COLLATE pg_catalog."default",
saldo_in_som numeric DEFAULT 0,
debet numeric DEFAULT 0,
kredit numeric DEFAULT 0,
saldo_out_som numeric DEFAULT 0,
defference numeric GENERATED ALWAYS AS ((saldo_out_som - saldo_in_som))
STORED,
saldo_in_usd numeric DEFAULT 0,
debit_usd numeric DEFAULT 0,
credit_usd numeric DEFAULT 0,
saldo_out_usd numeric DEFAULT 0,
difference_usd numeric GENERATED ALWAYS AS ((saldo_out_usd - saldo_in_usd))
STORED,
CONSTRAINT uniq__code UNIQUE (code)
)
TABLESPACE pg_default;
ALTER TABLE public.consolid
OWNER to postgres;
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
Пример вычисляемого столбца:
CREATE TABLE test (id INT, saldo_in INT, debit INT, kredit INT); INSERT INTO test VALUES (1,10,10,5), (2,100,50,120); SELECT * FROM test;id | saldo_in | debit | kredit -: | -------: | ----: | -----: 1 | 10 | 10 | 5 2 | 100 | 50 | 120
ALTER TABLE test ADD COLUMN saldo_out INT GENERATED ALWAYS AS (saldo_in + debit - kredit) STORED; SELECT * FROM test;id | saldo_in | debit | kredit | saldo_out -: | -------: | ----: | -----: | --------: 1 | 10 | 10 | 5 | 15 2 | 100 | 50 | 120 | 30
db<>fiddle here
