2009-02-02 3 views
0

중복 등록 레코드를 삽입하도록 사용자를 제한 할 수 있는지 궁금합니다. 예를 들어 일부 팀은 5.1.2009 - 31.12.2009에 등록됩니다. 그런 다음 누군가 5.2.2009 - 31.12.2009에 같은 팀을 등록합니다. 는 보통 종료일은 문제가되지 않지만 시작일 내가 프로그램, 데이터베이스가 아닌 안양 코드에서 그것을 확인 할 기록이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

답변

3

을 시작 및 종료 날짜 기존의 사이 안된다.

+0

비록 ... 더 쉬운 해결책으로 벗어나기를 원했습니다 :) – Riho

+0

추가 질의가 필요하지만 정보를 복제 할 때 정상적으로 실패하는 것이 더 쉽습니다 발견된다. – UnkwnTech

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

이것은 시간이 겹치는 고전적인 문제입니다. B (end_date)까지 A (start_date)의 기간 동안 특정 팀을 등록하려고한다고 가정 해보십시오.

는 다음의 경우에 허용되어서는 안

  1. 은 같은 팀이 이미 등록되어있는 상기 등록 기간이 AB 구간 안에 완전히되도록
  2. (시작일> = A 및 < = B를 종료일)
  3. 같은 팀 이미 점 (A)에서 등록 (시작일 < = A 및 종료일> = A)
  4. 같은 팀 이미 포인트 B (시작일 < = B 및 종료일> = B)
,745,151에 등록
  • 이러한 경우 등록을하면 시간이 겹치게됩니다. 다른 어떤 경우에는 그렇게하지 않으므로 등록 할 수 있습니다. 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-12-31'을 '2009-02-03'사이 leage 45 팀 (123)을 등록하고 수 있는지의 확인하자 :

    이를 증명하기 위해, 테이블을 채울 수 있도록

    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'은 불가능합니다. 연습용으로 다른 값을 확인해 드리겠습니다.

    추신 : 끝 날짜는 일반적으로 문제가되지 않는다고 말씀하셨습니다. 유효하지 않은 종료 날짜가있는 항목을 삽입하면 중복되기 때문에 사실입니다.

  • 관련 문제