首页 > 解决方案 > Postgresql 触发器约束

问题描述

我试图弄清楚如何制作我以前从未做过的触发约束。我正在使用 Java 和 Postgresql。

我有一个看起来像这样的表: 在此处输入图像描述

我需要两件事:

  1. 防止任何重复的唯一约束 [type_of_charge + time_of_use + Meter_register_code + period_of_availability] - 这已经通过标准唯一约束完成。

  2. 如果已经有一行具有相同的meter_register_code + period_of_availability,则触发器约束需要防止插入任何“任何时间”行。

  3. 如果已经存在“anytime”值,则触发器约束需要停止插入任何行。例如,如果已经存在任何时间值,则不能插入非峰值,但如果存在“峰值”值则可以。

标签: javasqlpostgresql

解决方案


我似乎已经通过以下方式解决了它:

 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();

通过修改我在这里找到的一篇文章:当验证不够时:PostgreSQL 触发数据完整性


推荐阅读