mysql - 在创建表 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
我尝试使用的oncheck
但return_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
我再次尝试使用check
on 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 ;
推荐阅读
- google-cloud-source-repos - 创建新存储库时出错 (PERMISSION_DENIED)
- flutter-provider - StreamProvider 小部件显示的需要构建错误的标记
- automation - 如何将文件与谷歌驱动器上的密钥相关联?
- laravel - 类 '\Omnipay\FirstData\Gateway' 未找到 Laravel 8
- python - 如何使用套接字将日期和时间从客户端发送到服务器
- javascript - 根据您是 VUE.js 的路线通过 $emit 发送参数的条件
- webpack - Webpack 块没有正确拆分
- windows - 在批处理文件中获取用户名和产品
- python - 如何在烧瓶启动时运行芹菜任务?
- c# - 尝试使用 NuGet 控制台在 EntityFrameWork Core 中迁移数据库时出现“脚本停止”错误