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
答案 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中已得到修复,但我还没有测试过。)