如何检查唯一列是否尚未包含正在插入的数据,以防止出错
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;
我正在使用这个数据库...基本上我必须创建一个“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;