You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
$$;

关键说明

  1. 参数设计:所有需要插入的字段都作为存储过程参数,其中Goals_Scored、Yellow_Card_Count、Red_Card_Count设置了默认值NULL,调用时可省略。
  2. 主动校验逻辑:通过EXISTS语句提前检查重复项,一旦发现就抛出明确的异常信息,让调用者清楚失败原因。
  3. 并发场景兜底:添加了EXCEPTION块捕获unique_violation异常(比如高并发下,两个请求同时检查同一Player_ID都通过,插入时触发主键冲突),确保异常能被正确处理。
  4. 姓名组合唯一性强化:建议给姓名组合添加数据库层面的唯一约束,避免存储过程校验被绕过:
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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:55:44