mysql constarint интервал пересечения

0

У меня есть таблица mysql

CREATE TABLE 'range' (
  'id' int(11) NOT NULL,
  'object_id' int NOT NULL,
  'datetime_from' datetime NOT NULL,
  'datetime_to' datetime NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Пожалуйста, помогите обеспечить реализацию ограничения уровня mysql: нет пересечения временных интервалов для одного объекта object_id.

  • 0
    MySQL не имеет проверенных ограничений. Даже если бы они были, вы не сможете использовать ограничения для того, что вы имеете в виду. Скорее всего, вам придется использовать триггер здесь, чтобы выполнить то, что вы хотите.
  • 0
    ... или вы можете просто встроить логику в саму ВСТАВКУ.
Показать ещё 1 комментарий
Теги:
constraints

1 ответ

0
Лучший ответ

Триггер в порядке, но, демонстрируя, что триггер не требуется, рассмотрим следующее...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (
  id SERIAL,
  dt_from DATE NOT NULL,
  dt_to DATE NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO my_table (dt_from,dt_to)
VALUES
('2018-05-31','2018-06-03');

- Попытка 1: противоречивые даты

SET @dt_from = '2018-05-28';
SET @dt_to = '2018-06-01';

INSERT INTO my_table (dt_from,dt_to) 
SELECT @dt_from
     , @dt_to
  FROM (SELECT 1) x
  LEFT 
  JOIN my_table y 
    ON y.dt_from < @dt_to 
   AND y.dt_to > @dt_from 
 WHERE y.id IS NULL;

- Попытка 2: Бесконфликтные даты

SET @dt_from = '2018-06-04'; 
SET @dt_to = '2018-06-06'; 

INSERT INTO my_table (dt_from,dt_to) 
SELECT @dt_from
     , @dt_to
  FROM (SELECT 1) x
  LEFT 
  JOIN my_table y 
    ON y.dt_from < @dt_to 
   AND y.dt_to > @dt_from 
 WHERE y.id IS NULL;

 SELECT * FROM my_table;
+----+------------+------------+
| id | dt_from    | dt_to      |
+----+------------+------------+
|  1 | 2018-05-31 | 2018-06-03 |
|  2 | 2018-06-04 | 2018-06-06 |
+----+------------+------------+

Увидеть. Конфликтующие даты игнорируются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню