【问题标题】:how to use trigger add column value while relate table insert record?如何在关联表插入记录时使用触发器添加列值?
【发布时间】:2020-07-25 09:29:12
【问题描述】:

我创建了以下 PostgreSQL 函数和相应的触发器。我想往user_star_raider表中插入数据,raider表中的stars列数据可以自动加1,但是现在我使用当前函数和触发器,结果不符合预期,能帮帮我吗?

攻略表:

 raider_id | stars | visits
-----------+-------+--------
 13243     |     0 |   4525

user_star:

 user_id | raider_id | star_date
---------+-----------+-----------

我创建函数和触发器:

CREATE OR REPLACE FUNCTION auto_increase_star() RETURNS TRIGGER AS $$
    BEGIN
        UPDATE raider SET stars = stars + 1 WHERE raider.raider_id = new.raider_id;
        RETURN new;
    end
$$
LANGUAGE plpgsql;

CREATE TRIGGER add_user_star_raider_trigger
    AFTER INSERT ON user_star_raider FOR EACH ROW EXECUTE PROCEDURE auto_increase_star();

当我在use_star_raider 中插入一行('1900327840@qq.com', '13243', '2020-07-25') 时,我希望raider stars 列增加1。

有什么好的解决办法吗?

【问题讨论】:

  • 我认为您可能缺少“PL/pgSQL”和“postgresql”标签。另外,请发布您的“user_star_raider”表的定义,除非“user_star:”是一个错字并且您不小心错过了“_raider”部分。请注意,“不符合预期”过于含糊。当你尝试这个时会发生什么?
  • 触发器看起来正确,你得到什么错误?
  • 您的代码有效:dbfiddle.uk/….
  • 一直正常工作。我修改了auto_increase_star()函数后,在插入记录之前对raider进行了更新操作,所以没有正常工作。

标签: sql postgresql plpgsql database-trigger


【解决方案1】:

如评论中所述,您的代码有效。这是db<>fiddle

我意识到我在 dbfiddle 中进行了一项更改以方便打字——这可能是您的问题的原因。我将 raider_id 从一个字符串更改为一个数字:处理的讨厌的引号更少。

反过来,这意味着这些值必然匹配;整数有一个很好的属性,即所见即所得。但是,对于字符串,可能会发生奇怪的事情——例如隐藏字符或来自不同字符集的相似字符。可能发生的情况是一切正常,但表之间的 raider_id 值不匹配。我的建议是建立外键关系,以确保第二个表中的raider_id 是基于第一个表的有效raider_id

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多