2009-02-02 70 views
0

我想知道是否可以限制用户插入重复的注册记录。 例如某些团队从2009年5月5日至2009年12月31日进行了注册。然后有人在2009年5月5日至2009年12月31日期间注册同一个团队。 通常END_DATE是不是一个问题,但起始日期不应与现有的记录开始和结束日期如何避免在MySQL中重复注册

CREATE TABLE IF NOT EXISTS `ejl_team_registration` (
    `id` int(11) NOT NULL auto_increment, 
    `team_id` int(11) NOT NULL, 
    `league_id` smallint(6) NOT NULL, 
    `start_date` date NOT NULL, 
    `end_date` date NOT NULL, 
    PRIMARY KEY (`team_id`,`league_id`,`start_date`), 
    UNIQUE KEY `id` (`id`) 
); 
+0

“start_date不应该在现有记录的开始和结束日期之间”。在你的例子中,start_date不在现有的开始和结束日期之间 – nickf 2009-02-02 14:05:45

回答

3

我会检查它的代码DF的程序,而不是数据库。

+0

尽管如此......希望通过更简单的解决方案逃脱:) – Riho 2009-02-02 14:07:06

0

在做INSERT之前,先做一个SELECT检查。

SELECT COUNT(*) FROM `ejl_team_registration` 
WHERE `team_id` = [[myTeamId]] AND `league_id` = [[myLeagueId]] 
    AND `start_date` <= NOW() 
    AND `end_date` >= NOW() 

如果返回大于0,则不要插入。

1

如果你想在数据库中做到这一点,你可以使用pre-insert trigger,如果有任何冲突的记录,将会失败。

1

这是一个经典的时间重叠问题。假设你想在A(start_date)期间注册某个团队直到B(end_date)。

这不应当在下一情况下,被允许:

  1. 同一团队已被注册,从而为注册周期是完全的AB时期内(起始> = A日期和结束日期< = B)
  2. 同一团队已经被登记在A点(起始< = A日期和结束日期> = A)
  3. 同一团队已经被登记在B点(起始< = B日期和结束日期> = B)

在这些情况下,注册会导致时间重叠。在任何其他它不会,所以你可以自由注册。

在SQL中,检查将是:

select count(*) from ejl_team_registration 
where (team_id=123 and league_id=45) 
and ((start_date>=A and end_date<=B) 
or (start_date<=A and end_date>=A) 
or (start_date<=B and end_date>=B) 
); 

...当然与实际值的对TEAM_ID,league_id,A和B.

如果查询返回什么比0一样,该团队已经注册并且再次注册会导致时间重叠。

为了证明这一点,让我们填充表:

insert into ejl_team_registration (id, team_id, league_id, start_date, end_date) 
values (1, 123, 45, '2007-01-01', '2007-12-31') 
, (2, 123, 45, '2008-01-01', '2008-12-31') 
, (3, 123, 45, '20010-01-01', '2010-12-31'); 

让我们来看看,如果我们能在 '2009-02-03' 之间leage 45注册团队123和 '2009-12-31':

select count(*) from ejl_team_registration 
where (team_id=123 and league_id=45) 
and ((start_date<='2009-02-03' and end_date>='2009-12-31') 
or (start_date<='2009-03-31' and end_date>='2009-03-02') 
or (start_date<='2009-12-31' and end_date>='2009-12-31') 
); 

结果为0,所以我们可以自由注册。 在例如'2009-02-03'和'2011-12-31'是不可能的。 我会留下检查其他值作为练习。 PS:你提到结束日期通常不是问题。事实上,事实上,由于插入具有无效结束日期的条目也会导致重叠。