PostgreSQL обновляет последнее введенное поле данных - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь справиться с этой ситуацией в базе данных PostgreSQL. Я вставляю данные в таблицу под названием «Счет-фактура» путем программирования:

invoice_id    account_id    amount  current 
    1            a2322        3      null
    2            a2322       10      null
    3            b4354        1      null
    4            c8099        2      null
    5            a2322        4      null
    6            b4354       -5      null

поэтому, когда вставляется новая запись, я хочу обновить поле current с суммой таких сумм:

invoice_id    account_id    amount  current 
    1            a2322        3      null
    2            a2322       10      null
    3            b4354        1      null
    4            c8099        2      null
    5            a2322        4      null
    6            b4354       -5      null
    7            a2322        4      result(sum of amount: 21)
    8            b4354        3      result(sum of amount: -1)

Могу ли я сделать это внутри PostgreSQL без программирования?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Технически это не прямой ответ на ваш вопрос. Но то, что вы хотите, это порядковый номер. Вы не должны хранить эту информацию. Можно рассчитать на лету:

SELECT *, SUM(amount) OVER(ORDER BY invoice_id) AS running_total;

Таким образом, вам не нужно беспокоиться об ошибках согласования и / или обновления. Особенно, если вам позже потребуется обновить количество, все промежуточные суммы будут испорчены, а SUM () OVER () всегда будет согласованным.

0 голосов
/ 30 октября 2018

Вы можете сделать это в триггере AFTER INSERT OR UPDATE OR DELETE, который запускает FOR EACH STATEMENT. Это тоже программирование, хотя и не на стороне клиента.

В триггере вы можете рассчитать суммы, подобные этой (при условии, что invoice_id равно serial):

INSERT INTO invoice
   (account_id, amount, current)
SELECT account_id, sum(amount), 'result'
FROM invoice
WHERE current IS NULL
GROUP BY account_id
HAVING count(*) > 1
ON CONFLICT (account_id, current)
DO UPDATE
   SET amount = EXCLUDED.amount;

Это требует ограничения UNIQUE для (account_id, current) и использует тот факт, что уникальные ограничения позволяют & ldquo; дублировать & rdquo; до тех пор, пока включены NULL.

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