我在想怎么做一个我从未做过的触发约束。我在Postgresql中使用Java。
我有一张桌子看起来是这样的:
我需要两件事:
一个唯一的约束,它防止任何重复的[电荷类型+使用时间+电表寄存器代码+可用周期]-这已经用一个标准的唯一约束完成了。
如果已经有一行具有相同的仪表寄存器代码+周期可用性,则触发器约束需要防止插入任何“anytime”行。
如果已经存在“anytime”值,则触发器约束需要停止插入任何行。例如,如果已经存在任何时间值,则不能插入非高峰值,但如果存在“高峰”值,则可以插入非高峰值。
最佳答案
我似乎已经解决了以下问题:
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:When Validation Is Not Enough: PostgreSQL Triggers for Data Integrity