У меня есть таблица 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.
Триггер в порядке, но, демонстрируя, что триггер не требуется, рассмотрим следующее...
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 |
+----+------------+------------+
Увидеть. Конфликтующие даты игнорируются.