编辑:8.0.20版本
我现在正在学习sql,我试图修复它,但我做不到。 我有三张桌子
create table order(
id_order int primary key,
order_date date
);
create delivery(
id_delivery int primary key,
delivery_date date,
cod_order int,
foreign key (cod_order) references order(id_order)
);
create purchased_product(
id_product int,
cod_order int,
return_date date,
foreign key (cod_order) references order(id_order)
primary key (id_product, cod_order)
);
这是一个比较容易的计划,但已经足够了。 code>return_date必须小于delivery_date+30天
我试图对return_date
使用check
,但没有工作,因此我创建了一个视图,仅选择已交付的产品
create view product_order_delivery(date_delivered_product) as
select date_delivery
from purchased_product P right join (select date_delivery, id_order
from order right join delivery
on order.id_order = delivery.cod_order
where date_delivery is not null) OD
on P.cod_order = OD.id_order
我用check
在return_date
上再次尝试。
有人能帮我弄明白怎么修吗?
提前感谢:)
解决这一问题的两种常见选择是:
对于您的情况,另一种方法可能就足够了。 更改return_date
的定义,使其为days_to_return
。 然后可以使用check
约束:
check (days_to_return between 0 and 30)
当然,要获得实际日期,您将需要连接这两个表来获取交付日期。
编辑:
insert
触发器如下所示:
delimiter $$
create trigger trig_purchased_product_return_date
before insert on purchased_product
for each row
begin
select @delivery_date = delivery_date
from delivery d
where d.cod_order = new.cod_order;
if new.return_date < @delivery_date or new.return_date > @delivery_date + interval 30 day then
signal sqlstate '45000' set message_text = 'invalid return_date'
end if
end;
delimiter ;