MySQL Trigger для обновления другой таблицы - PullRequest
1 голос
/ 31 марта 2011

У меня есть следующие две таблицы в базе данных MySql:

Bookings
BookingID | ClientID | SeatID

SeatAvailability
SeatAvailabilityID | BookingID | ShowID | Available 

Они связаны по SeatID / SeatAvailabilityID. Я пытаюсь написать триггер, который обновляет таблицу SeatAvailability каждый раз, когда строка добавляется в бронирование. Триггер должен изменить SeatAvailability.Available на 0, а также ввести BookingID из бронирований в поле BookingID в SeatAvailability с тем же SeatAvailabilityID.

Я написал этот триггер, MySql принимает его, но выдает ошибку при вставке «ОШИБКА 1054: неизвестный столбец« cinemax.bookings.SeatID »в« предложении где »».

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$$

Ответы [ 2 ]

1 голос
/ 31 марта 2011

попробуй

AFTER INSERT ON `cinemax`.`bookings`

вместо

AFTER UPDATE ON `cinemax`.`bookings`
0 голосов
/ 07 мая 2011

Это несколько месяцев с опозданием, но я решил сделать это быстро, прежде чем сдать общее задание. Тем временем я переключился на postgres, так как он, казалось, предлагал больше функциональности (хотя и не так удобен для пользователя). Сначала я должен был создать функцию триггера:

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();

Мне не удалось получить BookingID в SeatAvailability для обновления по какой-то причине (при вставке ничего не произошло, а при удалении я получил сообщение о том, что Available не может быть нулевым, даже если я менял BookingID), поэтому я пропустил это в postgres, и вместо этого реализовал его с помощью Java. Это не лучший способ, но все же лучше, чем ничего.

Я решил опубликовать свое решение на тот случай, если у кого-то возникнет похожая проблема, и он наткнется на этот вопрос.

...