Mysql 导致错误1054的SQL触发器

Mysql 导致错误1054的SQL触发器,mysql,sql,triggers,Mysql,Sql,Triggers,上面是我为一家干洗店编写的数据库的触发器。触发器的作用是让每一位拥有干洗店会员资格的顾客每下10次订单都能获得折扣。但是,当我们输入以下数据时 delimiter // CREATE TRIGGER Discount BEFORE INSERT ON ORDER_TABLE FOR EACH ROW BEGIN DECLARE OrderNum INT; DECLARE Membership BOOLEAN; DECLARE Disc DECIMAL(10, 2);

上面是我为一家干洗店编写的数据库的触发器。触发器的作用是让每一位拥有干洗店会员资格的顾客每下10次订单都能获得折扣。但是,当我们输入以下数据时

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;

我们得到了错误1054:字段列表中的列OrderCount未知,即使OrderCount存在于customer表中

我与oracle合作,这是非常不同的,但是读取触发器我建议您,将4个查询重写为2,这样可以避免每个表读取两次

.: .:

.: .:
.:

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

另一个问题是订单号何时更新,我无法从这个设计中分辨出来。最好将其添加到触发器中,这样客户表中的订单数量将随着触发器的增加而增加一个,然后可以对其进行检查

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


当您引用另一个被截断的表时,MySQL 5.6.17中的触发器存在错误:


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

向我们展示Customer表的结构。。。可能尝试在SQL Fiddle上重新创建它?创建表CUSTOMER(CustomerID int not null AUTO_INCREMENT,LastName varchar(45)not null,FirstName varchar(45)not null,Email varchar(255),Address varchar(45),State varchar(45),Zip varchar(5),OrderCount int not null,成员布尔,主键CustomerID));我不喜欢这样做作为一个触发器,我宁愿事先得到信息。一方面,触发器可以关闭(然后忘记)。我还希望统计
Order\u表中的记录(适当的条件是不统计/不允许未付款订单)-实际上,客户可以创建多个(未处理的)订单来获得折扣。除此之外,第一张订单是打折的,从订单11开始,每10张订单就有一张。对于首选项,我希望有一个单独的
折扣表,可以将其添加到该表中,以实现灵活性。什么分配了
订单ID
insert into order_table values(0, 1, curdate(),20140426, null , 100, 10, 0, 110);
.:
 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;
UPDATE `customer` SET `OrderCount`=OrderCount+1 WHERE `CustomerID`=NEW.CustomerID;