【问题标题】:problem with behavior trigger, doesn't work行为触发器的问题,不起作用
【发布时间】:2021-01-14 10:36:39
【问题描述】:

我正在使用这个数据库...基本上我必须创建一个“promote_cyclist”触发器,以在网格表中记住符合条件的运动员(在环意自行车赛的舞台上排名第一)。

这些表格是:

  • cyclist(cyclist_id:Int,name_cyclist:字符串,team:三个字母的字符串,country:三个字母的字符串)

  • 磁带(_name:字符串,km:int,类型:“flat”或“high_mountain”或“medium_mountain”或“chronometro_a_team”或“chronometro_individual”或“time_trial”)

  • arrival_order (cyclist_id:int ; tape_name:string, order: int):其中 cyclist_id (resp, tape_name) 是指向 cyclist (resp, tape) 的外部键;

  • magliarosa(名称:字符串);

这是我在 shell 上加载的触发器 ...

CREATE FUNCTION promote_cyclist()
RETURNS TRIGGER AS
$$
BEGIN
    INSERT INTO magliarosa
        SELECT c.name_cyclist
        FROM cyclist c
        WHERE new.cyclist_id = c.cyclist_id AND
              new.order = 1;
RETURN NULL;
END ;
$$
LANGUAGE plpgsql;

这是我传递给 shell 的命令:

 CREATE TRIGGER promote_cyclist
 BEFORE INSERT ON arrival_order
 EXECUTE PROCEDURE promote_cyclist ();

在上传了arrival_order txt文件后,至少赢得一个赛段的车手的名字应该记录在magliarosa的名字上。然而,这不会发生。你能帮帮我吗?

【问题讨论】:

  • 你在CREATE TRIGGER 语句中错过了子句FOR EACH ROW

标签: sql postgresql triggers plpgsql


【解决方案1】:

您创建了一个 BEFORE TRIGGER,因此它会在 INSERT 真正发生之前触发。但 RETURN NULL 告诉数据库用 NULL 替换 NEW 有效负载。

尝试返回新的;

【讨论】:

  • 谢谢,我添加了“每一行”并更改了返回值......现在元组被插入到“Magliarosa”中,但如果骑自行车的人赢得多个赛段,他的名字可能是在“Magliarosa”中多次出现。 ...我认为在“promote_cyclist”函数中使用一个简单的“SELECT DISTINCT c.cyclist_name”就足够了,但事实并非如此...我该如何解决这个问题?
  • 当一个名字应该只出现一次时,我会使用一个唯一的约束并确保插入会检查冲突:ON CONFLICT DO NOTHING
  • 好的,所以基本上在“名称”旁边我放了“唯一”....“在冲突中什么都不做”我应该在哪里写?
  • 是的,UNIQUE 约束可以在创建表、创建唯一索引或创建单独的唯一约束时创建。这三个都可以正常工作。手册中描述了 ON CONFLICT 并显示了一些示例:postgresql.org/docs/13/sql-insert.html#SQL-ON-CONFLICT
  • 据我了解,它应该与“插入”一起使用,但我不使用此命令插入元组...我使用复制...我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2023-04-05
  • 2016-01-02
  • 2018-10-17
  • 2017-04-22
相关资源
最近更新 更多