mysql constarint interval intersection

独自空忆成欢 提交于 2019-12-04 06:54:10

问题


I have mysql table

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;

Please help to provide on mysql level constraint implementation: no time interval intersection for same object_id.


回答1:


A trigger is fine, but by way of demonstrating that no trigger is required, consider the following...

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');

-- Attempt 1: conflicting dates

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;

-- Attempt 2: Non-conflicting dates

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 |
+----+------------+------------+

See. Conflicting dates are ignored.



来源:https://stackoverflow.com/questions/50666343/mysql-constarint-interval-intersection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!