如何在PostgreSQL中创建带异常处理的Player表插入存储过程
创建添加球员的存储过程(含重复校验与异常处理)
针对你的需求,以下是基于PostgreSQL的存储过程实现,包含Player_ID重复、球员姓名组合重复的校验逻辑,以及对应的异常处理:
存储过程代码
CREATE OR REPLACE PROCEDURE local.add_new_player( p_player_id integer, p_club_id integer, p_group_id integer, p_first_name character varying(20), p_last_name character varying(20), p_goals_scored integer DEFAULT NULL, p_yellow_card_count integer DEFAULT NULL, p_red_card_count integer DEFAULT NULL ) LANGUAGE plpgsql AS $$ BEGIN -- 校验Player_ID是否已存在 IF EXISTS (SELECT 1 FROM local."Player" WHERE "Player_ID" = p_player_id) THEN RAISE EXCEPTION 'Player_ID % 已存在,无法添加', p_player_id; END IF; -- 校验球员姓名(First_Name+Last_Name)是否已存在 IF EXISTS (SELECT 1 FROM local."Player" WHERE "First_Name" = p_first_name AND "Last_Name" = p_last_name) THEN RAISE EXCEPTION '球员姓名 % % 已存在,无法添加', p_first_name, p_last_name; END IF; -- 执行插入操作 INSERT INTO local."Player" ( "Player_ID", "Club_ID", "Group_ID", "First_Name", "Last_Name", "Goals_Scored", "Yellow_Card_Count", "Red_Card_Count" ) VALUES ( p_player_id, p_club_id, p_group_id, p_first_name, p_last_name, p_goals_scored, p_yellow_card_count, p_red_card_count ); -- 可选:输出成功提示 RAISE NOTICE '球员 % % 已成功添加', p_first_name, p_last_name; EXCEPTION -- 捕获并发场景下的主键/唯一约束冲突 WHEN unique_violation THEN -- 区分是Player_ID还是姓名组合的冲突 IF SQLERRM LIKE '%unique_player_name%' THEN RAISE EXCEPTION '球员姓名 % % 已存在,无法添加', p_first_name, p_last_name; ELSE RAISE EXCEPTION 'Player_ID % 已存在,无法添加', p_player_id; END IF; END; $$;
关键说明
- 参数设计:所有需要插入的字段都作为存储过程参数,其中
Goals_Scored、Yellow_Card_Count、Red_Card_Count设置了默认值NULL,调用时可省略。 - 主动校验逻辑:通过
EXISTS语句提前检查重复项,一旦发现就抛出明确的异常信息,让调用者清楚失败原因。 - 并发场景兜底:添加了
EXCEPTION块捕获unique_violation异常(比如高并发下,两个请求同时检查同一Player_ID都通过,插入时触发主键冲突),确保异常能被正确处理。 - 姓名组合唯一性强化:建议给姓名组合添加数据库层面的唯一约束,避免存储过程校验被绕过:
ALTER TABLE local."Player" ADD CONSTRAINT unique_player_name UNIQUE ("First_Name", "Last_Name");
使用示例
调用存储过程添加球员:
-- 添加有完整数据的球员 CALL local.add_new_player(101, 1, 2, 'Lionel', 'Messi', 700, 120, 10); -- 添加无进球/卡牌数据的球员(省略可选参数) CALL local.add_new_player(102, 1, 2, 'Cristiano', 'Ronaldo');
内容的提问来源于stack exchange,提问作者bassam_
相关产品推荐
相关产品推荐

