Java Postgresql触发器约束

Java Postgresql触发器约束,java,sql,postgresql,Java,Sql,Postgresql,我试图弄明白如何做一个触发约束,这是我以前从未做过的。我正在使用Java和Postgresql 我有一张这样的桌子: 我需要两样东西: 防止任何重复的唯一约束[费用类型+使用时间+仪表寄存器+可用性周期]-这已通过标准唯一约束完成 如果已经存在一行相同的电表\寄存器\代码+可用性周期\的行,则触发器约束需要防止插入任何“随时”行 如果已经存在“anytime”值,则触发器约束需要停止插入的任何行。e、 g.如果已经存在anytime值,则不能插入Off Peak,但如果存在“Peak”值,则可

我试图弄明白如何做一个触发约束,这是我以前从未做过的。我正在使用Java和Postgresql

我有一张这样的桌子:

我需要两样东西:

  • 防止任何重复的唯一约束[费用类型+使用时间+仪表寄存器+可用性周期]-这已通过标准唯一约束完成

  • 如果已经存在一行相同的电表\寄存器\代码+可用性周期\的行,则触发器约束需要防止插入任何“随时”行

  • 如果已经存在“anytime”值,则触发器约束需要停止插入的任何行。e、 g.如果已经存在anytime值,则不能插入Off Peak,但如果存在“Peak”值,则可以插入Off Peak


  • 我似乎已经用以下方法解决了这个问题:

     CREATE OR REPLACE FUNCTION validate_network_pricing_code() returns trigger as $$
      DECLARE
        tester int;
      BEGIN
      IF NEW.time_of_use = 'ANYTIME'
      THEN tester := (SELECT COUNT(*) FROM network_pricing_category_code WHERE (
            network_pricing_category_code.meter_register_code = NEW.meter_register_code AND
            network_pricing_category_code.period_of_availability = NEW.period_of_availability AND
            network_pricing_category_code.network_pricing_category_id = NEW.network_pricing_category_id AND
            network_pricing_category_code.id != NEW.id  
        ));
        END IF;
        IF NEW.time_of_use IS NOT NULL AND NEW.time_of_use != 'ANYTIME' 
        THEN tester := (SELECT COUNT(*) FROM network_pricing_category_code WHERE (
            network_pricing_category_code.time_of_use = 'ANYTIME' AND
            network_pricing_category_code.meter_register_code = NEW.meter_register_code AND
            network_pricing_category_code.period_of_availability = NEW.period_of_availability AND
            network_pricing_category_code.network_pricing_category_id = NEW.network_pricing_category_id AND
            network_pricing_category_code.id != NEW.id  
        ));
        END IF;
        IF (tester != 0) THEN
          RAISE EXCEPTION 'ANYTIME rates cannot be combined with other types of rates - PEAK, SHOULDER, OFF-PEAK etc ';
        END IF;
        RETURN NEW;
      END;
      $$ language plpgsql;
    
    
     CREATE TRIGGER validate_network_pricing_code_trigger BEFORE INSERT OR UPDATE ON network_pricing_category_code
          FOR EACH ROW EXECUTE PROCEDURE validate_network_pricing_code();
    

    通过修改我在这里找到的一个writeup:

    请回答您的问题,并向我们展示
    create table
    语句。听起来好像这可以用一个,但我真的看不懂你的截图,所以我不是100%肯定和3。听起来好像可以使用部分唯一indexA触发器来完成,除非您使用的是
    SERIALIZABLE
    隔离级别,否则它永远不能保证约束。我给出的答案有什么问题?