gpt4 book ai didi

sql - 检查一个表(列)中的日期是否适合另一个表(列)中的另一个日期

转载 作者:行者123 更新时间:2023-12-04 23:53:51 26 4
gpt4 key购买 nike

假设我有两个表,如下所示。

create table contract(
c_ID number(1) primary key,
c_name varchar2(50) not null,
start date not null,
end date not null,
d_ID number(1) null,
constraint fk_discount_ID
foreign key(d_ID) references discount(d_ID)
);

create table discount(
d_ID number(1) primary key not null,
d_amount decimal(4,2) not null,
valid_from date,
valid_until date
);

现在我想添加一个约束来检查折扣在契约(Contract)开始日期是否有效。例如,契约(Contract)于2015年5月1日开始,折扣有效期至2015年4月30日,不适用于上述契约(Contract)。

我该如何做这个约束?

最佳答案

不幸的是,您不能使用约束执行如此复杂的验证。

虽然有一种方法可以结合使用实体化 View 约束(参见my blog),但实际上我们通常不会这样做,因为它可能会对性能产生不利影响。

触发器是一种选择,但我会避免使用它们,因为它们很难正确设置,因此它们在多用户系统中始终可以正常工作。

剩下最常见的方法(根据我的经验):为执行业务规则的事务构建 PL/SQL API,以便应用程序调用 API 而不是简单地在 contract 中插入一行像这样:

contract_api.create_contract 
( p_name => :name
, p_start => :start
, p_d_id => :d_id
...
);

API 在插入之前验证业务规则,因此此调用可能会失败并出现如下异常:

ORA-20001: Discount not valid on contract start date

关于sql - 检查一个表(列)中的日期是否适合另一个表(列)中的另一个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com