代码之家  ›  专栏  ›  技术社区  ›  Evg

mysql常量区间交集

  •  0
  • Evg  · 技术社区  · 8 年前

    我有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级别的约束实现:同一个对象的id没有时间间隔交集。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Strawberry    8 年前

    触发器是可以的,但是为了证明不需要触发器,请考虑以下几点…

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

    看。冲突日期将被忽略。