MySQL触发器更新另一个表

时间:2011-03-31 15:07:10

标签: mysql sql triggers mysql-error-1054

我在MySql数据库中有以下两个表:

Bookings
BookingID | ClientID | SeatID

SeatAvailability
SeatAvailabilityID | BookingID | ShowID | Available 

它们与SeatID / SeatAvailabilityID相关联。 我正在尝试编写一个触发器,每次在预订中插入一行时更新SeatAvailability表。触发器应该更改SeatAvailability.Available为0并且还将预订中的BookingID输入SeatAvailability中具有相同SeatAvailabilityID的BookingID字段。

我已经写过这个触发器,MySql接受了它但插入时出错了 “错误1054:'where子句'中的未知列'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 个答案:

答案 0 :(得分:1)

尝试

AFTER INSERT ON `cinemax`.`bookings`

而不是

AFTER UPDATE ON `cinemax`.`bookings`

答案 1 :(得分:0)

这已经晚了几个月,但我决定在递交整个作业之前给它快速拍摄。与此同时,我切换到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();

由于某些原因,我无法在SeatAvailability中获取BookingID(在插入时没有发生,在删除时我收到错误告诉我可用不能为空,即使我正在更改BookingID)所以我省略了在postgres中,用Java实现它。这不是最好的方式,但总比没有好。

我决定发布我的解决方案,万一有人遇到类似的问题并且偶然发现这个问题。