限制数据库表仅包含一个将来的日期记录

时间:2019-03-07 08:22:47

标签: mysql database database-design

我们的项目要求一张桌子上只允许有一个将来的带日期记录。每个表都使用开始日期和结束日期维护记录版本。下面的屏幕快照中附有一个示例场景。 (假设今天的日期是2019年3月7日)

enter image description here

因此,如何限制数据库表具有多个将来的带日期记录。是否有任何约束或触发器将有助于从数据库本身进行验证?(我正在使用MySQL数据库)

1 个答案:

答案 0 :(得分:0)

一种简单的方法可能是例如在触发器中用null覆盖结束日期

drop trigger if exists t;
delimiter $$
create trigger t before insert on t
for each row 
begin
    declare cnt int default 0;
    select count(*) into cnt from t where end_date > date(now());
    if cnt > 0 then
        set new.end_date = null;
    end if;
end $$

delimiter ;


insert into t (designation,end_date) values 
('a','2019-03-07'),('a','2019-03-07'),('a','2019-04-07'),('a','2019-04-07'),
('b','2019-04-07');

select * from t;

+----+-------------+------------+
| id | designation | end_date   |
+----+-------------+------------+
|  1 | a           | 2019-03-07 |
|  2 | a           | 2019-03-07 |
|  3 | a           | 2019-04-07 |
|  4 | a           | NULL       |
|  5 | b           | NULL       |
+----+-------------+------------+
5 rows in set (0.00 sec)

如果愿意,可以通过if是否存在测试来稍微调整代码。