【问题标题】:PostgreSQL Trigger with duplicate values具有重复值的 PostgreSQL 触发器
【发布时间】:2014-11-22 02:51:29
【问题描述】:

我是 SQL 和 PostgreSQl 的新手,对于以下问题,我需要一个绝望的答案:

我有以下两个表,其中包含以下信息:

MATCH_STATISTICS

比赛

使用这两个表,我需要创建一个 TRIGGER,将 MATCH_STATISTICS 中的玩家添加到 MATCH,其中 MAX 值来自“mvp_score”。

换句话说,我想将 MATCH_STATISTICS 中最有价值的球员添加到 MATCH 但有一个条件: * 如果有两名球员的 mvp_score 相同,则存储的最有价值球员将是出场时间达到 MAX 分钟的球员。

我能够使用最大值执行第一个 TRIGGER,但是当我有两个重复值时,代码会添加最后修改的值。

有人知道怎么做吗? TRIGGER 应该在 INSERT、UPDATE 或 DELETE 之后执行

非常感谢,抱歉我的英语不好......

【问题讨论】:

  • 为什么要为此使用触发器?这很容易通过查询来计算。而且,除非您的表有数十万行或更多行,否则您可能甚至不会注意到性能。
  • 因为我需要使用 INSERTS 和 UPDATES 用新信息更新表。我不想手动更新 MATCH 表。换句话说,在我在 MATCH_STATISTICS 中添加新行之后,我想要一个 TRIGGER 来控制最有价值的玩家。
  • 不,您不需要更新匹配表。创建一个返回该信息的 视图。那么你就不用担心触发器了。
  • 我完全同意你的观点,但我需要用 TRIGGER 来解决这个问题。是否有更好的解决方案并不重要,就我而言,我需要一个触发器。很抱歉,事情就是这样。
  • 好吧...那我该如何查看或查询呢?因为我不知道该怎么做...

标签: sql function postgresql triggers


【解决方案1】:

最后我找到了一种制作TRIGGER的方法来解决我的问题,代码是......

CREATE OR REPLACE FUNCTION mvp_player_equal()
RETURNS trigger AS $$
DECLARE
    max_points INTEGER;
BEGIN
    SELECT MAX(mvp_score)
    INTO max_points
    FROM MATCH_STATISTICS;

    IF (TG_OP = 'INSERT') THEN

        IF max_points = NEW.mvp_score THEN 
            UPDATE match SET mvp_player = (SELECT player FROM MATCH_STATISTICS WHERE minutes_played = 
            (SELECT MAX(minutes_played) FROM MATCH_STATISTICS WHERE mvp_score = NEW.mvp_score) 
                AND mvp_score = NEW.mvp_score) WHERE home_team = NEW.home_team AND visitor_team = NEW.visitor_team;
        END IF;

        RETURN NULL;

    ELSIF (TG_OP = 'UPDATE') THEN

        IF max_points = NEW.mvp_score THEN 
                UPDATE match SET mvp_player = (SELECT player FROM MATCH_STATISTICS WHERE minutes_played = 
                (SELECT MAX(minutes_played) FROM MATCH_STATISTICS WHERE mvp_score = NEW.mvp_score) 
                AND mvp_score = NEW.mvp_score) WHERE home_team = NEW.home_team AND visitor_team = NEW.visitor_team;

        END IF;

        RETURN NULL;

    END IF; 

END;
$$LANGUAGE plpgsql;

CREATE TRIGGER mvp_player_equal AFTER INSERT OR DELETE OR UPDATE OF
mvp_score ON MATCH_STATISTICS
FOR EACH ROW
EXECUTE PROCEDURE mvp_player_equal();

但正如前面提到的 cmets 所说,这不是解决此问题的更好方法。还有像Gordon Linoffa_horse_with_no_name说的更好的方法。

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2012-04-01
    • 2012-03-25
    • 2020-11-16
    相关资源
    最近更新 更多