MySQL的触发器来更新另一个表
问题描述:
我有以下两个表在MySQL数据库:MySQL的触发器来更新另一个表
Bookings
BookingID | ClientID | SeatID
SeatAvailability
SeatAvailabilityID | BookingID | ShowID | Available
他们正在SeatID/SeatAvailabilityID链接。 我试图编写一个触发器,每次在预订中插入一行时都更新SeatAvailability表。触发器应该将SeatAvailability.Available更改为0,并且还将同样SeatAvailabilityID的SeatAvailability中的BookingID从预订输入到SeatID中的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$$
答
这几个月的晚,但我还是决定整体转让之前移交给它一个快速射击。与此同时,我转向了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更新一些原因(在插入没有发生和删除我有一个错误告诉我可用不能为空,即使我改变了预订ID),所以我省略了在postgres中,并用Java实现它。这不是最好的方式,但总比没有好。
我决定发布我的解决方案,以防万一有人遇到类似的问题,并且在这个问题上遇到困难。
答
尝试
AFTER INSERT ON `cinemax`.`bookings`
,而不是
AFTER UPDATE ON `cinemax`.`bookings`
您应该使用'AFTER INSERT'而不是'AFTER UPDATE' – Nishant 2011-03-31 15:10:12