2017-04-22 1 views
0

데이터베이스의 오퍼 및 요청과 일치하는 트리거를 올바르게 시도하고 일치하는 경우 데이터를 다른 테이블에 추가하려고합니다. 이것은 나를 위해 꽤 복잡 해지고 누군가가 올바른 방향으로 나를 가리킬 수 있습니다.두 테이블의 데이터를 확인한 다음 다른 테이블에 추가하는 MySQL 트리거

CREATE TRIGGER rideMatch 
AFTER INSERT ON rideRequest 
FOR EACH ROW 
BEGIN 
IF EXISTS(
    SELECT * from rideOffer r 
    where r.time = new.time AND 
    r.date = new.date AND 
    r.pickUpLocation = new.pickUpLocation AND 
    r.dropOffLocation = new.dropOffLocation 
    ) 
THEN 
    INSERT INTO Ride(rideDate, pickUpTime, pickUpLocation, dropOffLocation, driver, carName) 
    VALUES(new.date, new.time, new.pickUpLocation, new.dropOffLocation, r.driver, r.carName); 
    END IF; 
+0

적어도 'END' 키워드가 누락되었습니다. 그러나 이것은 단일 명령문 트리거이기 때문에'BEGIN' 키워드 만 제거하면됩니다. –

+0

이 쿼리의 문제점은 무엇입니까? –

+0

나는 더 분명해야했습니다. 또한 원본 테이블에서 항목이 삭제되면 삭제하려고합니다. 또한 나에게 끝에 약간의 구문 에러를 주었고 마지막 insert 문에서 r 테이블을 참조 할 수 있는지 잘 모르겠습니다. –

답변

0

첫째, 나는 로직 이러한 유형의 트리거에서 수행해야한다고 생각하지 않습니다 는 여기에 지금까지 무슨이다. 그것은 응용 프로그램 논리처럼 보이지만 데이터 무결성은 아닙니다. 저장 프로 시저가 더 적당한 장소처럼 보입니다.

그렇다면 오퍼 테이블에서 데이터를 가져와야합니다.

CREATE TRIGGER rideMatch 
AFTER INSERT ON rideRequest 
FOR EACH ROW 
BEGIN 
    insert into Ride(rideDate, pickUpTime, pickUpLocation, dropOffLocation, driver, carName) 
    select new.date, new.time, new.pickUpLocation, new.dropOffLocation, 
      r.driver, r.carName 
    from rideOffer r 
    where r.time = new.time AND 
      r.date = new.date AND 
      r.pickUpLocation = new.pickUpLocation AND 
      r.dropOffLocation = new.dropOffLocation 
    limit 1; 
end; 

참고 :

  • rideOffer 일치하는 임의 선택합니다 나는이 같은 생각.
  • 일치하는 항목이 없으면 아무 것도 삽입되지 않습니다.
  • rideOffer이 여러 요청에 사용될 수 있기 때문에 최소한이 논리는 올바르지 않습니다.
  • 필드의 값을 입력하는 대신 실제로 rideOffer의 기본 키를 사용해야합니다.

즉, 귀하의 질문에 대한 대답입니다. 그러나 응용 프로그램 디자인에 큰 결함이 있다고 생각합니다.이 결함은이 질문의 범위를 벗어납니다.

관련 문제