Ограничить таблицу DB наличием только одной записи, датированной будущим

#mysql #database #database-design

#mysql #База данных #база данных-дизайн

Вопрос:

В нашем проекте есть требование, чтобы в таблице была разрешена только одна запись, датированная будущим. Все таблицы поддерживают версии записей, используя дату начала и дату окончания. Пример сценария приведен на скриншоте ниже. (предположим, что сегодняшняя дата — 7 марта 2019)

введите описание изображения здесь

Итак, как я могу ограничить таблицу базы данных, чтобы в ней было более одной записи, датированной будущим. Существуют ли какие-либо ограничения или триггеры, которые помогли бы выполнить проверку из самой базы данных?.(Я использую MySQL db)

Комментарии:

1. Какие-либо другие используемые технологии (php, python)?

2. ДА. Мы используем комбинацию Java Springboot Mybatis Mysql.

3. Просто для ясности, вам разрешено вводить строку 6 (старший менеджер), но конечная дата должна быть нулевой, если есть другая дата окончания, датированная будущим?

4. Если будущая дата равна нулю, тогда считайте ее 31 декабря 9999. Я прояснил ваш запрос.?

5. нет, пожалуйста, прочитайте мой комментарий еще раз и объясните, почему в строке 7 нет даты 31 декабря 9999

Ответ №1:

Простым способом может быть перезапись конечных дат на 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 exists, если хотите.