2014-11-10 1 views
0

가장 낮은 ID를 가진 행을 트리거가 반복적으로 삭제하도록 만들지 않겠습니다. 그리고 되풀이해서 나는 숫자와 사용자 이름이 두 줄로 같은 것을 의미합니다. 예를 들어MSQ는 동일한 테이블에서 DELETE 할 수 없습니다. SELECTS - DELETE TRIGGER의 회피 방법에 대한 도움이 필요합니다.

ROW1 : ID : 1 감소 : 1, UN : MVJ 및

행 2 : ID : 2 감소 : 1, UN : MVJ

이러한 되풀이된다

있지만 'Nr'또는 'UN'이 다른 경우에는 그렇지 않습니다.

제목에서 알 수 있듯이 MYSQL은 적어도 내 SQL 문을 작성한 방식으로는 그렇게 할 수 없습니다. 전적으로 다른 방법으로 문제를 해결할 수 있습니다.

Drop trigger no_double_reservations; 
    DELIMITER !! 
    CREATE TRIGGER no_double_reservations 
    AFTER INSERT ON tilmeldte 
    FOR EACH ROW BEGIN 
    IF(
     SELECT COUNT(*) 
     FROM tilmeldte 
     WHERE (kursus_nr, username) 
     IN (
      SELECT kursus_nr, username 
      FROM tilmeldte 
      GROUP BY kursus_nr, username 
      HAVING COUNT(*) = 2 
      ) = 2 
     ) 
    THEN 
    DELETE FROM tilmeldte 
    Where tilmeldingsid = (
     Select MIN(`tilmeldingsid`) 
     FROM tilmeldte 
     WHERE (kursus_nr, username) 
     IN (
      SELECT MIN(kursus_nr), username 
      FROM tilmeldte 
      GROUP BY kursus_nr, username 
      HAVING COUNT(*) = 2 
      ) 
         ); 
    END IF; 
    END!! 
    DELIMITER ; 

귀하 께서 도와 주시면 감사하겠습니다.

+0

사전 대책을 세우시고 이중 예약을하지 않으시겠습니까? 삽입하기 전에 검사를하고 오류 메시지가있는 데이터 저장을 거부합니까? –

+0

가능한 복제본 [DELETE TRIGGER-FAILURE의 문언] (http://stackoverflow.com/questions/26170470/if-statement-in-delete-trigger-failure) 이전에 물어 본 질문과 다른 질문입니까? –

+1

@BerndLinde 중복이 아니기 때문에, 그는 마지막 질문 이후로 작동하지 않는다는 것을 알고 있기 때문에 ** 다른 ** 방법을 요구하고 있습니다. – bummi

답변

0

테이블 정의를 지정하지 않았으므로 여기에 MySQL에서이 작업을 수행하는 방법에 대한 논리가 있습니다.

사용자 이름 걸리는 저장 프로 시저없이> 단지 새로운 레코드를 삽입하고있을 것입니다 코드에서 메시지를 다시

를 보내는 경우 예> 삭제하고 새로운 ID 을 삽입하면 사용자 이름이 이미 존재 여부를 검사를 kursus_id 만들 좋아.

CREATE PROCEDURE `SP_NEW_RESERVATION` (in iUsername varchar(50), in iKursus_id int) 
BEGIN 

    DECLARE EXIT HANDLER for sqlexception 
    BEGIN 
     rollback; 
     SELECT 'False' as Result, 'Some error description or diagnose description from mysql' as `Description`; 
    END; 

    Start Transaction; 
     SET @mExists := (SELECT ID from tbl_yourTable where ((kursus_id = iKursus_id) and (username like iUsername))); 
     if (length(coalesce(@mExists,'')) <> 0) then 
      -- username does not exists so you can continue with insert a new reservation 
      insert into tbl_yourTable and continue here 

      -- send back message 
      SELECT 'True' as Result, 'New record inserted') as `Description`; 
     ELSE 
      -- username exists already and the id would be saved in mExists so delete the id and continue with your insert_method 
      Delete from Tbl_yourtable where id = @mExists something ligke that; 
      insert into tbl_yourtable ..... 

      -- you can send back a message like 
      SELECT 'True' as Result, concat('Old record(', @mExists, ') Deleted and new record inserted') as `Description`; 
     end if; 
    Commit; 

END 

위의 코드가 불완전합니다. 이 코드를 실행하려면 삽입 및 삭제 명령을 수정해야합니다. 그런 다음 프로 시저를 호출하십시오. 사용자 이름 'KrishKm가'이미 같은 메시지를 다시 얻을 것이다 존재하는 경우

call SP_NEW_RESERVATION('KrishKm', 2); 

은 :

사실, 오래된 레코드 (10) 삭제하고 새 레코드를 삽입. 다시 메시지가 표시되지 않은 경우

는 :

False, 'Some error description or diagnose description from mysql' 

행운을 빕니다 : 아무것도 잘못되면

True, New record inserted. 

당신은 메시지가 나타납니다.