2012-05-14 41 views
0

我需要一个mysql表的约束。该表的字段为'id','ref','from'和'to'。约束可以保证没有数据集具有相同的'ref'和时间重叠('和'到'的字段')。一个mysql表的难度约束

在sql中:以下语句应始终返回'0'。

select count(*) 
from `TABLE` d1 inner join `TABLE` d2 on 
     d1.`ref` = d2.`ref` and d1.`id` <> d2.`id` and 
     d1.`to` >= d2.`from` and d1.`from`<=d2.`to` 

有没有办法处理这与约束?

+1

纠正我,如果我错了,但我认为你需要一个触发器来处理这样的事情。 –

+1

MySQL约束仅检查是否存在,而不是值范围。尽管触发器很容易。 –

+0

然后触发器必须停止执行(插入或更新之前)并可能抛出异常,这可能吗? – user1027167

回答

0

现在我有以下触发器。谢谢你的帮助!

DELIMITER $$ 

USE `devtestplandb`$$ 

CREATE 
TRIGGER `db`.`trig1` 
BEFORE INSERT ON `db`.`TABLE` 
FOR EACH ROW 
BEGIN 
    SET @CNT = (
      select count(*) 
      from `TABLE` d 
      where d.`ref` = NEW.`ref` and 
        d.`to` >= NEW.`from` and 
        d.`from` <= NEW.`to`); 
    IF @CNT != 0 THEN 
     CALL error_001(); 
    END IF; 
END$$ 

CREATE 
TRIGGER `db`.`trig2` 
BEFORE UPDATE ON `db`.`TABLE` 
FOR EACH ROW 
BEGIN 
    SET @CNT = (
      select count(*) 
      from `TABLE` d 
      where d.`ref` = NEW.`ref` and 
        d.`ID` <> NEW.`ID` and 
        d.`to` >= NEW.`from` and 
        d.`from` <= NEW.`to`); 
    IF @CNT != 0 THEN 
     CALL error_002(); 
    END IF; 
END$$