首页 > 解决方案 > 在创建表 sql 中检查日期

问题描述

编辑:版本 8.0.20

我现在正在学习sql,我尝试修复它但我无法做到。我有 3 张桌子

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)
);

这是一个更简单的方案,但已经足够了。return_date必须小于delivery_date + 30 days 我尝试使用的oncheckreturn_date没有工作,所以我创建了一个视图以仅选择交付的产品

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

我再次尝试使用checkon return_date

有人可以帮助我了解如何解决它吗?

提前致谢 :)

标签: mysqlsqldatecreate-table

解决方案


解决此问题的两个常见选项是:

  1. 编写触发器以确保条件为真。
  2. 编写一个用户定义的函数并在检查约束中使用它。

在您的情况下,另一种方法可能就足够了。改变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 ;

推荐阅读