我在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$$
答案 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实现它。这不是最好的方式,但总比没有好。
我决定发布我的解决方案,万一有人遇到类似的问题并且偶然发现这个问题。