如何检查唯一列是否尚未包含正在插入的数据,以防止出错

How to check if unique column does not already contain data being inserted, preventing error

我正在使用这个数据库...基本上我必须创建一个“promote_cyclist”触发器,以记住符合条件的运动员(在 Giro d'Italia 的舞台上排名第一)在网格中 table.

table 是:

cyclist (cyclist_id: Int, name_cyclist: string, team: string of three letters, country: three-letter string)

tape (_name: string, km: int, type: 'flat' or 'high_mountain' or 'medium_mountain' or 'chronometro_a_team' or 'chronometro_individual' or 'time_trial')

arrival_order (cyclist_id:int ; tape_name:string, order: int): where cyclist_id (resp, tape_name) is an external key that refers to cyclist (resp, tape);

magliarosa( name:string (UNIQUE) );

这是我在 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 NEW;
END ;
$$
LANGUAGE plpgsql;

这是我传递给 shell 的命令:

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

我想要的是没有重复穿着粉红色球衣的运动员的名字(为此我输入了 UNIQUE)...但是触发器不理解...结果是因此出现错误,因为您尝试插入更多相同的名称...您能帮帮我吗?我不知道该怎么做...

您在该函数中的查询可能如下所示:

INSERT INTO magliarosa
        SELECT DISTINCT(c.name_cyclist)
        FROM cyclist c
        WHERE new.cyclist_id = c.cyclist_id AND
              new.order = 1 AND 
              c.name_cyclist NOT IN (SELECT magliarosa.name FROM magliarosa);

DISTINCT 关键字将确保在选择 c.name_cyclist 时不会有重复的结果,而另一个条件 c.name_cyclist NOT IN (SELECT magliarosa.name FROM magliarosa) 将确保您不会插入已经存在的值马利亚罗萨 table.

也许您想要 INSERT ... ON CONFLICT 以便在名称已存在时更新该名称:

CREATE FUNCTION promote_cyclist() RETURNS TRIGGER AS
$$BEGIN
    INSERT INTO magliarosa (name)
        SELECT c.name_cyclist
        FROM cyclist c
        WHERE NEW.cyclist_id = c.cyclist_id AND
              NEW.order = 1
    ON CONFLICT ON (name)
        DO UPDATE SET name = EXCLUDED.name;

    RETURN NEW;
END;$$
LANGUAGE plpgsql;