create table sql中的check date

l0oc07j2  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(524)

编辑:版本8.0.20
我刚刚在学习sql,我试着去修复它,但是我做不到。我有三张table

  1. create table order(
  2. id_order int primary key,
  3. order_date date
  4. );
  5. create delivery(
  6. id_delivery int primary key,
  7. delivery_date date,
  8. cod_order int,
  9. foreign key (cod_order) references order(id_order)
  10. );
  11. create purchased_product(
  12. id_product int,
  13. cod_order int,
  14. return_date date,
  15. foreign key (cod_order) references order(id_order)
  16. primary key (id_product, cod_order)
  17. );

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

  1. create view product_order_delivery(date_delivered_product) as
  2. select date_delivery
  3. from purchased_product P right join (select date_delivery, id_order
  4. from order right join delivery
  5. on order.id_order = delivery.cod_order
  6. where date_delivery is not null) OD
  7. on P.cod_order = OD.id_order

我又试了一次 checkreturn_date .
有人能帮我弄明白怎么修吗?
提前感谢:)

v9tzhpje

v9tzhpje1#

解决此问题的两个常见选项是:
编写触发器以确保条件为真。
编写一个用户定义的函数并在check约束中使用它。
在你的情况下,另一种方法可能就足够了。更改的定义 return_date 的确如此 days_to_return . 然后你可以用 check 约束条件:

  1. check (days_to_return between 0 and 30)

当然,要获得实际日期,您需要将两个表连接起来以获取交货日期。
编辑:
这个 insert 触发器如下所示:

  1. delimiter $$
  2. create trigger trig_purchased_product_return_date
  3. before insert on purchased_product
  4. for each row
  5. begin
  6. select @delivery_date = delivery_date
  7. from delivery d
  8. where d.cod_order = new.cod_order;
  9. if new.return_date < @delivery_date or new.return_date > @delivery_date + interval 30 day then
  10. signal sqlstate '45000' set message_text = 'invalid return_date'
  11. end if
  12. end;
  13. delimiter ;
展开查看全部

相关问题