2009-02-02 42 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:你提到結束日期通常不是問題。事實上,事實上,由於插入具有無效結束日期的條目也會導致重疊。