edit: version 8.0.20
I’m learning sql just now, I try to fix it but I’m not able to do it. I have 3 table
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) );
This is an easier scheme but it’s enough.
The return_date
must be less than delivery_date + 30 days
I tried to use a check
on return_date
but no work, so I created a view to select the delivered products only
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
and I tried again with check
on return_date
.
Can someone help me to understand how fix it?
thanks in advance 🙂
Advertisement
Answer
Two common options for solving this are:
- Write a trigger to be sure the condition is true.
- Write a user-defined function and use that in a check constraint.
An alternative method might suffice in your case. Change the definition of return_date
so it is days_to_return
. Then you can use a check
constraint:
check (days_to_return between 0 and 30)
Of course, to get the actual date, you will need to join the two tables to fetch the delivery date.
EDIT:
The insert
trigger would look something like this:
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 ;