Postgresql 如果在目标表中已检测到n个重复值,如何在插入时抛出SQL错误

Postgresql 如果在目标表中已检测到n个重复值,如何在插入时抛出SQL错误,postgresql,plpgsql,database-trigger,Postgresql,Plpgsql,Database Trigger,我有一个由两列组成的交叉表,培训计划和课程。我的老板要求我组织培训,这样人们就不能在培训计划中增加超过50门课程 我想我应该用扳机 我试着跟着这个 我得到的错误是——我已经尝试了一些语法方面的东西,但没有帮助,添加和删除;您的代码主要存在以下问题: raiseexception语句必须以分号结尾 在变量声明之后,有两个BEGINs,而应该只有一个 代码: 那么问题出在哪里呢?也许可以添加一个在引发异常之后并在插入之前创建触发器我希望您知道存在争用条件:两个这样的触发器同时运行,每个触发器都不

我有一个由两列组成的交叉表,培训计划和课程。我的老板要求我组织培训,这样人们就不能在培训计划中增加超过50门课程

我想我应该用扳机

我试着跟着这个

我得到的错误是——我已经尝试了一些语法方面的东西,但没有帮助,添加和删除;您的代码主要存在以下问题:

  • raiseexception
    语句必须以分号结尾
  • 在变量声明之后,有两个
    BEGIN
    s,而应该只有一个
代码:


那么问题出在哪里呢?也许可以添加一个
引发异常之后
并在插入之前创建触发器
我希望您知道存在争用条件:两个这样的触发器同时运行,每个触发器都不会从另一个事务中看到
插入
。这样,您就可以在计数超过限制的情况下结束ou。
CREATE OR REPLACE FUNCTION fn_count_tracks_per_map()
RETURNS TRIGGER AS
$BODY$
BEGIN 
    DECLARE
        val INTEGER;
        BEGIN
            SELECT COUNT(*) INTO val FROM ntnx_track_in_map m WHERE m.map_id = new.map_id; 
    IF val > 49
    THEN 
      RAISE EXCEPTION 'INSERT failed, maximum tracks in map reached'
    END IF;
    RETURN new;
END
$BODY$
    LANGUAGE plpgsql VOLATILE
CREATE OR REPLACE FUNCTION fn_count_tracks_per_map()
RETURNS TRIGGER AS
$BODY$
    DECLARE val INTEGER;
    BEGIN
        SELECT COUNT(*) INTO val FROM ntnx_track_in_map m WHERE m.map_id = new.map_id; 
        IF val > 49 THEN
            RAISE EXCEPTION 'INSERT failed, maximum tracks in map reached';
        END IF;
        RETURN new;
    END
$BODY$ 
LANGUAGE plpgsql VOLATILE;