Postgresql 触发器约束
Posted
技术标签:
【中文标题】Postgresql 触发器约束【英文标题】:Postgresql trigger constraint 【发布时间】:2018-05-08 10:14:29 【问题描述】:我试图弄清楚如何制作一个我以前从未做过的触发约束。我正在使用 Java 和 Postgresql。
我有一张看起来像这样的表:
我需要两件事:
防止任何重复的唯一约束 [type_of_charge + time_of_use +meter_register_code + period_of_availability] - 这已经通过标准唯一约束完成。
如果已经有一行具有相同的meter_register_code + period_of_availability,则触发器约束需要防止插入任何“任何时间”行。
如果已经存在“anytime”值,则触发器约束需要停止插入的任何行。例如如果已经存在任何时间值,则不能插入非峰值,但如果存在“峰值”值则可以。
【问题讨论】:
请edit您的问题并向我们展示create table
声明为formatted text请,no screen shots请
2.听起来好像可以使用exclusion constraint 来完成,但我无法真正阅读您的屏幕截图,所以我不是 100% 确定和 3. 听起来好像可以使用部分唯一索引来完成
除非您使用SERIALIZABLE
隔离级别,否则触发器永远无法保证约束。我给here的答案有什么问题?
【参考方案1】:
我似乎已经通过以下方式解决了它:
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();
通过修改我在这里找到的一篇文章:When Validation Is Not Enough: PostgreSQL Triggers for Data Integrity
【讨论】:
以上是关于Postgresql 触发器约束的主要内容,如果未能解决你的问题,请参考以下文章