#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, если хотите.