У меня есть 3 таблицы invoice_items, topup и topup_usage.На invoice_items
есть 2 column
, который я использую для триггера amount
и account_id
.
Таблица invoice_items
:
id account_id type amount
200 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 4
201 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 7
202 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 2
Таблица topup_usage
:
id id_topup balance
Таблица и там начальные данные для пополнения баланса topup
:
id account_id amount_ds status
322 ac96c2bc-d4e3-4d75-9814-0186be8e0163 4 active
323 ac96c2bc-d4e3-4d75-9814-0186be8e0163 7 active
324 ac96c2bc-d4e3-4d75-9814-0186be8e0163 2 active
имеют такую ситуацию, когда новые данные, вставленные в таблицу invoice_item, получают 2 данных из столбца account_id
и amount
чтобы вставить стол, где account_id
для account_id
и amount
для amount_ds
.Затем я делаю 2 транзакции в моей системе, где триггер, когда статус «использование» из таблицы invoice_items
, выглядит следующим образом:
id account_id type amount
200 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 4
201 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 7
202 ac96c2bc-d4e3-4d75-9814-0186be8e0163 topup 2
203 ac96c2bc-d4e3-4d75-9814-0186be8e0163 usage 2
204 ac96c2bc-d4e3-4d75-9814-0186be8e0163 usage 3
, чтобы вставить данные в topup_usage
, что я пытаюсь сделать так:
id topup_id amount
399 322 2
400 322 3
Я пытаюсь сделать так, чтобы общее значение topup_id 322 было максимально 4, как для topup_ таблицы (amount_ds
), но всего 5, если общее использование превышено для topup_id, превышено, например, 4, например 5, оно генерируетследующий topup_id вот так:
id topup_id amount
399 322 2
400 322 2
401 323 1
затем для topup_id 323 рассчитывается максимум 7, но, как и ранее для topup_id 323, осталось использовать максимум 6.Затем, если 7 вставлено, как это
id topup_id amount
399 322 2
400 322 2
401 323 1
402 323 6
403 324 1
, и я использую триггер, как это:
create or replace function topup_usage() returns trigger
language plpgsql
as $$
BEGIN
IF new.type = 'USAGE' THEN
IF(SELECT notes = 'true' FROM accounts WHERE accounts.id = new.account_id) THEN
IF ((SELECT amount_ds FROM topup WHERE topup.account_id = new.account_id AND status = 'active' ORDER BY id ASC LIMIT 1) - new.amount < 0 AND (SELECT COUNT(id) > 1 FROM topup WHERE topup.account_id=new.account_id)) THEN
INSERT INTO topup_usage (id_topup, balance)
VALUES((SELECT id FROM topup WHERE topup.account_id = new.account_id and status = 'active' limit 1), (SELECT amount_ds FROM topup WHERE topup.account_id=new.account_id AND status='active' ORDER BY id ASC LIMIT 1) - (SELECT COALESCE(sum(balance), 0) FROM topup_usage WHERE id_topup=(SELECT id FROM topup WHERE topup.account_id=new.account_id ORDER BY id DESC LIMIT 1)) );
INSERT INTO topup_usage (id_topup, balance)
VALUES((SELECT id FROM topup WHERE topup.account_id = new.account_id and status = 'active' ORDER BY id ASC limit 1) + 1, new.amount - (SELECT balance FROM topup_usage WHERE id_topup=(SELECT id FROM topup WHERE topup.account_id=new.account_id ORDER BY id ASC LIMIT 1)));
ELSE
INSERT INTO topup_usage (id_topup, balance)
VALUES((SELECT id FROM topup WHERE topup.account_id = new.account_id and status = 'active' limit 1), new.amount);
END IF;
IF ((SELECT amount_ds FROM topup WHERE id =(SELECT id FROM topup WHERE status = 'active' ORDER BY id ASC limit 1)) - (SELECT SUM(balance) FROM topup_usage WHERE id_topup=(SELECT id FROM topup WHERE status = 'active' ORDER BY id ASC limit 1))) <= 0 THEN
UPDATE topup SET status = 'finish' WHERE id = (SELECT id FROM topup WHERE status = 'active' ORDER BY id ASC limit 1);
END IF;
END IF;
END IF;
return null;
END;
$$;
этот результат, что случилось со мной:
id topup_id amount
399 322 2
400 322 3
не такэто:
id topup_id amount
399 322 2
400 322 2
401 323 1
402 323 6
403 324 1
есть предложения?