SQL - 触发器更新错误

时间:2016-12-20 21:41:30

标签: mysql sql database-design triggers database-trigger

我开始学习SQL,并建立了一个房屋数据库,其中有一个房子,房间,走廊等的桌子。我在House中有一个名为NumberOfRooms的列,以及一个名为HouseName的列。

我正在尝试触发,以便当房间被添加到房屋时,House属性“NumberOfRooms”会递增。

这是我正在尝试的查询:

CREATE TRIGGER UpdateNoRooms AFTER INSERT AS 
UPDATE Houses SET Houses.NumberOfRooms = SELECT COUNT(Room) 
                                         FROM Rooms 
                                         WHERE Rooms.HouseName = Houses.Name;

,但它不起作用。

这是我收到的错误消息:

  

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“AS UPDATE Houses SET Houses.NumberOfRooms = SELECT COUNT(Room) FROM Rooms WHERE”附近使用正确的语法

关于如何解决此问题的任何想法?提前谢谢

2 个答案:

答案 0 :(得分:1)

这是一个快速版本 - 你有非规范化 - 这不是一个好主意。相反,应留出房间数来查询时间。

CREATE TRIGGER UpdateNoRooms AFTER INSERT AS
BEGIN
    UPDATE Houses h
        SET h.NumberOfRooms = h.NumberofRooms+1 WHERE :new.HouseName = h.Name;
END;

答案 1 :(得分:1)

请参阅MySQL documentation中的语法图。您错过了命令的几个必需部分:

  1. 您需要ON tablename告诉它应该将触发器附加到哪个表格。

  2. 在触发器体之前需要FOR EACH ROW

  3. 您不需要计算房间数。添加房间只会使房间数增加1。

  4. 所以它应该是:

    CREATR TRIGGER UpdateNoRooms 
    AFTER INSERT ON Rooms
    FOR EACH ROW
        UPDATE Houses AS h
        SET h.NumberOfRooms = h.NumberOfRooms + 1
        WHERE h.HouseName = NEW.HouseName