2011-03-31 3 views
1

내가 MySQL 데이터베이스에서 다음 두 테이블이 한을 업데이트합니다. Bookings에 행을 삽입 할 때마다 SeatAvailability 테이블을 업데이트하는 트리거를 작성하려고합니다. 트리거는 SeatAvailability.Available을 0으로 변경해야하며 동일한 SeatAvailabilityID를 사용하여 SeatAvailability의 BookingID 필드에 Bookings의 BookingID를 입력해야합니다.MySQL의 트리거는 다른 테이블

이 트리거를 작성했지만 MySql은이를 허용하지만 "오류 1054 : 알 수없는 열 'cinemax.bookings.SeatID'를 'where 절'에 삽입하면 오류가 발생합니다.

DELIMITER $$ 

USE `cinemax`$$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `cinemax`.`update_available` 
AFTER INSERT ON `cinemax`.`bookings` 
FOR EACH ROW 
UPDATE cinemax.seatavailability 
SET cinemax.seatavailability.Availabe=0, cinemax.seatavailability.BookingID=cinemax.bookings.BookingID 
WHERE cinemax.bookings.SeatID=cinemax.seatavailability.SeatAvailabilityID$$ 
+1

"AFTER UPDATE"대신에 "AFTER INSERT"를 사용해야합니다. – Nishant

답변

0

노력하지만, 나는 전체 할당에 전달하기 전에 그것을 빠른 기회를 제공하기로 결정했다. 그 동안 나는 더 많은 기능을 제공하는 것 같았지만 (사용자 친화적이지는 않지만) 포스트그레스로 전환했다. 내가 먼저 트리거 기능을 만들 수 있었다 :

CREATE OR REPLACE FUNCTION updateseatavailable() 
RETURNS trigger AS 
$BODY$ 
BEGIN 

      IF (TG_OP = 'INSERT') THEN 
       UPDATE "SeatAvailability" 
      SET "Available"='FALSE' AND "BookingID"=NEW."BookingID" WHERE "SeatAvailabilityID"=NEW."SeatID"; 

      ELSIF (TG_OP = 'DELETE') THEN 
      UPDATE "SeatAvailability" 
      SET "Available"='TRUE' WHERE "SeatAvailabilityID"=OLD."SeatID"; 

      END IF; 

      RETURN NEW; 
     END; 
    $BODY$ 
     LANGUAGE plpgsql VOLATILE 

을 다음 단순히 트리거에서 함수/프로 시저를 호출

CREATE TRIGGER UpdateSeatAvailable 
AFTER INSERT OR DELETE ON "Bookings" 
FOR EACH ROW 
EXECUTE PROCEDURE updateSeatAvailable(); 

내가 일부 업데이트 할 SeatAvailability에 BookingID을 얻을 수 없습니다 이유 (삽입에 아무 일도 일어나지 않았다.) Delete 오류가 발생했습니다. 예약 ID를 변경하더라도 Available이 null 일 수 없습니다. 따라서 postgres에서이를 생략하고 대신 Java로 구현했습니다. 최선의 방법은 아니지만 아무것도 아닌 것보다 낫습니다.

누군가가 비슷한 문제가있어이 질문에 비틀 거린 경우를 대비하여 솔루션을 게시하기로 결정했습니다.

1

그것은 말 몇 달의

AFTER INSERT ON `cinemax`.`bookings` 

대신

AFTER UPDATE ON `cinemax`.`bookings` 
+0

새 행을 삽입하려고 할 때 다음과 같은 오류가 발생합니다. "where 절에 'cinemax.bookings.SeatID'알 수없는 열이 있습니다." – Matt

+0

예약에는 SeatID, 난 그냥 혼란을 피하기 위해 내 질문에 SeatAvailabilityID 전화. 질문을 편집하여 정확히 데이터베이스와 비슷합니다. 지금까지 도움을 주셔서 감사합니다. UPDATE ON 대신 INSERT ON이 맞습니다. – Matt

+0

@Kentz 거기에 쿼리에 문제가 있습니다 - 그리고 열 이름의 쿼리에 오타가있을 가능성이 큽니다. 쿼리를 독립적으로 실행하십시오. – Nishant