2014-04-30 73 views
0

我正在处理一个应用程序,其中一个JSP页面将信息填写在表单上并将它们插入到MySQL中的表中。mySQL数据库条目的条件

My table : 

+-------- +-------------+------+-----+------------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------- +-------------+------+-----+------------+-------+ 
|UserID | varchar(10) | NO | PRI |   |  | 
|ino  | int(5)  | NO | PRI | 0   |  | 
|epno  | int(5)  | NO | PRI | 0   |  | 
|startDate| date  | NO | PRI | 0000-00-00 |  | 
|enddate | date  | NO |  |   |  | 
|dist  | int(4)  | YES |  | NULL  |  | 
|cost  | int(6)  | YES |  | NULL  |  | 
+---------+-------------+------+-----+------------+-------+ 

我需要每个用户的StartDate和EndDate期间是唯一的。 此外,没有任何条目应该重叠。

例如,如果userOne进入以下条目

 StartDate- April 30,2014 , EndDate:May 5, 2014 

且存在于表中的条目:

  StartDate- May 2,2014 , EndDate:May 6, 2014 

它不应该被允许。

到目前为止,我只指定了多个主键。如果他们没用,我可以改变他们。

请随时提出有关问题的任何问题。 谢谢!

回答

1

您可以强制执行这一约束与BEFORE INSERTtrigger

DELIMITER ;; 

CREATE TRIGGER my_trigger BEFORE INSERT ON my_table FOR EACH ROW 
IF EXISTS (
    SELECT * 
    FROM my_table 
    WHERE StartDate <= NEW.EndDate 
    AND EndDate >= NEW.StartDate 
    LIMIT 1 
) THEN 
    SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = 'Period overlaps with existing record'; 
END IF;; 

DELIMITER ; 
+0

我尝试这样做。它说'你的SQL语法有错误'。 我认为这不受我的MYSQL版本(5.2)的支持。 你能否提出一些其他方法可以解决这个问题? – user3270763

+0

@ user3270763:你是对的,['SIGNAL'](http://dev.mysql.com/doc/en/signal.html)是在MySQL v5.5中引入的。或者,你可以简单地执行一些引起错误的操作,例如调用一个不存在的过程,例如'CALL raise_error;'。 – eggyal