Рассчитать остаток на каждой строке и вставить в следующую строку идентификатора в таблице с помощью Trigger PostgreSQL - PullRequest
0 голосов
/ 29 ноября 2018

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

есть предложения?

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