[英]PostgreSQL Trigger to update game count on insert/delete of array elements
我想在game_catalog
表上創建一個觸發器,以便每次用戶從其收藏game_catalog
中添加或刪除游戲時,總游戲計數都會更新。 由於游戲集合存儲為文本數組,因此我決定使用array_length函數來計算游戲數量。
game_catalog
id - BIGSERIAL primary key
user_id - INTEGER
game_list - text []
game_count - INTEGER
我試圖創建一個觸發器,以便在插入或刪除后重新計算game_list
列的長度,但是它不起作用。 這是我現在擁有的:
CREATE OR REPLACE FUNCTION count_games()
RETURNS TRIGGER AS $$
BEGIN
UPDATE game_catalog
SET game_count = (SELECT array_length(game_list, 1) from game_catalog)
WHERE user_id = NEW.user_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER count_games
AFTER INSERT OR DELETE ON game_catalog FOR EACH ROW
EXECUTE PROCEDURE count_games();
因此,有兩件事:
也就是說,您可以不同地定義觸發器以使其起作用:
-- only watch for insert/updates on the game_list column to avoid infinite loop
-- delete doesn't matter here
CREATE TRIGGER count_games
BEFORE INSERT OR UPDATE OF game_list
ON game_catalog
FOR EACH ROW
EXECUTE PROCEDURE count_games();
盡管視圖會更好:
CREATE OR REPLACE VIEW game_catalog_count AS
SELECT id, user_id, game_list, array_length(game_list,1) as game_count
FROM game_catalog;
而且您的觸發函數可能需要一點改進(除非您計划引用其他行...但是在觸發函數設計中還有其他問題):
CREATE OR REPLACE FUNCTION count_games()
RETURNS TRIGGER AS $$
BEGIN
NEW.game_count := array_length(NEW.game_list, 1);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
希望對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.