Генерируемы столбцы в Генерируемых столбцах

У меня есть база 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

→ Ссылка