【发布时间】:2012-09-24 08:30:46
【问题描述】:
我有以下选择语句,我在一个函数中使用它来检查记录的重叠,这个函数是从应用程序前端调用的。
SELECT count(*),product_no
from products p where lower(p.PRODUCT_REG_NO) ='GB-UNIGAS'
and (NVL (p.return_date, p.end_date) >= '01-Jan-2015')
and p.product_no in (select product_no from PRODUCT_MASTER where EXPIRED='N'
and product_no = p.product_no)
我想在表中创建一个约束,而不是检查记录重叠的函数,这样即使在数据库级别也不会有任何插入或更新。
如何用上面的sql语句创建一个约束?
任何帮助都是非常值得赞赏的。
谢谢
【问题讨论】:
-
使用 BEFORE INSERT OR UPDATE 触发器docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg13trg.htm(往下看 3/4,在“复杂检查约束的触发器:示例”处)
-
与您的问题没有直接关系,但我强烈建议使用具有已定义日期格式的 to_date() 而不是 NVL (p.return_date, p.end_date) >= '01-Jan -2015')。否则,您的应用程序将无法在其他语言环境中正常运行。
-
@lc. 最好有约束或触发器来实现业务规则?问候
-
触发器是执行此操作的方法 - 但请先阅读stackoverflow.com/questions/460316/are-database-triggers-evil。根据我的经验,触发器往往需要非常高的回报来支付额外的复杂性。如果您对此有实际问题,请考虑一下,但如果它是“以防万一”,我可能不会创建触发器....
标签: database oracle plsql oracle10g constraints