От новичка до гуру: Курсы программирования на CyberDuff

Триггер Postgresql для подсчета общего балла

Я пытаюсь научиться создавать триггер в postgresql. у меня есть стол

Thread_user - имя таблицы thread_id user_id точек

Thread - имя таблицы thread_id total_points

Я хочу, чтобы при обновлении любой строки thread_user обновлялось общее количество баллов в таблице потоков. Мне нужно в основном выбрать * из thread_user, где thread_id = thread_id вставленного элемента, а затем добавить точки, а затем обновить thread_points в таблице потоков. Я считаю, что это делается в триггерах, но, возможно, хранимая процедура была бы лучше.


  • Значения, которые можно вычислить из данных в ваших таблицах, обычно не должны храниться в базе данных. Вы рискуете сохранить неправильные данные. 22.07.2015
  • Захрек, я понимаю это, но реальная ценность этих цифр по сравнению с потенциальным временем выполнения, которое каждый раз вычисляется, стоит разницы. 22.07.2015
  • Хорошо, это уважительная причина. Просто хотел убедиться, что ты это знаешь. Я дал решение вашей проблемы. 22.07.2015

Ответы:


1

Первый шаг — создать функцию, которая вычисляет сумму баллов и обновляет строку в таблице calculate_points.

После этого вам нужно будет создать триггер, который вызывается при вставке строки в таблицу user_points.

DROP TABLE IF EXISTS user_points CASCADE;
CREATE TABLE user_points (
    id          SERIAL PRIMARY KEY,
    user_id     INT NOT NULL,
    points      INT NOT NULL
);

DROP TABLE IF EXISTS calculated_points CASCADE;
CREATE TABLE calculated_points (
    id          SERIAL PRIMARY KEY,
    user_id     INT  NOT NULL UNIQUE,
    points      INT NOT NULL

);

INSERT INTO calculated_points (user_id, points)
    VALUES
        (1, 0),
        (2, 0);

CREATE OR REPLACE FUNCTION calculate_total_points() 
RETURNS trigger AS $calculate_total_points$
BEGIN
    UPDATE calculated_points 
        SET points = (SELECT SUM(points)
                         FROM user_points
                         WHERE user_id = NEW.user_id)
         WHERE user_id = NEW.user_id;

    RETURN NEW;
END;
$calculate_total_points$ LANGUAGE plpgsql;

CREATE TRIGGER points_added
  AFTER INSERT
  ON user_points
  FOR EACH ROW
  EXECUTE PROCEDURE calculate_total_points();
22.07.2015
  • NB: со временем это будет становиться все медленнее и медленнее, поскольку все строки из user_points должны считываться (внутри calculate_total_points) каждый раз, когда вставляется одна строка. Итак, если user_points содержит, например. 100 миллионов строк, то вставка одной строки в таблицу вызовет чтение 100 миллионов строк. 22.02.2021
  • Новые материалы

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..