SQL触发器导致错误1054

时间:2014-04-24 23:23:41

标签: mysql sql triggers

delimiter //
CREATE TRIGGER Discount
BEFORE INSERT ON ORDER_TABLE
FOR EACH ROW BEGIN
    DECLARE OrderNum INT;
    DECLARE Membership BOOLEAN;
    DECLARE Disc DECIMAL(10, 2);
    DECLARE Cost DECIMAL(10, 2);

    SELECT OrderCount INTO OrderNum
    FROM Customer
    WHERE CustomerID = NEW.CustomerID;

    SELECT Member INTO Membership
    FROM Customer
    WHERE CustomerID = NEW.CustomerID;

    SELECT Discount INTO Disc
    FROM Order_Table
    WHERE OrderID = NEW.OrderID;

    SELECT Price INTO Cost
    FROM Order_Table
    WHERE OrderID = NEW.OrderID;

    IF(Membership = TRUE) THEN
        IF(MOD(OrderCount, 10) = 0) THEN
            SET NEW.Discount = Cost/2;
        END IF;
    END IF;
END//
delimiter;

以上是我为干洗店写的数据库的触发器。触发器应该是这样的,以便每个在干洗店拥有会员资格的客户都可以获得每10个订单的折扣。但是,当我们输入以下数据时

insert into order_table values(0, 1, curdate(),20140426, null , 100, 10, 0, 110);

我们收到错误1054:字段列表中的未知列OrderCount,即使客户表中存在OrderCount

3 个答案:

答案 0 :(得分:1)

首先,错误消息来自if块中的OrderCount。您应该使用您声明的变量并将此值读入OrderNum。

您可能会遇到的另一个问题是,我可以通过此设计告诉您,更新订单号时。最好将其添加到触发器中,以便使用触发器将Customer表中的订单数增加1,然后可以对其进行检查。

我刚将这一行添加到触发器中(在变量声明之后):

UPDATE `customer` SET `OrderCount`=OrderCount+1 WHERE `CustomerID`=NEW.CustomerID; 

答案 1 :(得分:0)

我与oracle合作并且它完全不同,但是我建议你读取你的触发器,将4个查询重写为2,这样你就可以避免两次读取每个表格。

.: :

.:
 SELECT OrderCount, Member 
    INTO OrderNum, Membership
    FROM Customer
    WHERE CustomerID = NEW.CustomerID;

    SELECT Discount, Price 
    INTO Disc, Cost
    FROM Order_Table
    WHERE OrderID = NEW.OrderID;

.: 。: :

答案 2 :(得分:0)

当你引用另一个被截断的表时,MySQL 5.6.17中的触发器存在一个错误:http://bugs.mysql.com/bug.php?id=72446

也许这就是原因?我试图通过将TRUNCATE table_name更改为DELETE FROM table_name来解决此问题。 (此外,错误报告似乎表明这在MySQL 5.6.19中已得到修复,但我还没有测试过。)