我需要一些帮助来获得正确的语法来定义PHPmyAdmin中的触发器。 是)我有的: 2个表 - 发票和invoiceitem tbl_invoice有一个字段'Total',它应该显示表invoiceitem的'Extended'价格的总和
tbl_invoiceitem有2个触发器,用于更新'Extended'forest_insert和before_update
我尝试完成的任务:
计算发票的所有项目的总和,并在插入新项目或更新现有项目的价格或数量后更新tbl_invoice中的“总计”价格。
我尝试在PHPmyAdmin中执行此操作。
错误消息是
我希望有人能给出一个正确方向的暗示。刚开始使用触发器,似乎没有找到解决方案,只需要几天的时间搜索互联网。
提前感谢您的帮助。
干杯,奥利弗
答案 0 :(得分:1)
我的代码中可以看到2个语法错误:
分隔符命令应该在触发器定义之外,而不是在其内部。 Phpmyadmin应该照顾好这一点。
begin ... end块中的命令应以分号(;)结束,而不是在delimiter命令中提供的任何内容。
我没有检查触发器中的sql命令是否有意义,但set命令的where条件似乎不正确。
答案 1 :(得分:1)
好的,找到了解决方法:在文件中写入完整的创建触发器语句,然后使用PHPmyAdmin导入。
As' Shadow'指出在哪里条件也存在问题
低于在我的场景中有效的纠正触发器
网上有很多例子可以用mysql客户端完成触发器。这样,您可以使用您在客户端中键入的确切语法,而不是导入到PHPmyAdmin,以防您无法通过命令shell客户端访问使用的服务器。
希望这有助于其他新手
干杯,奥利弗
-- after_insert trigger for InvoiceItem to Calculate the Total in Invoice
------------------------------------------------------------------------
DELIMITER //
CREATE TRIGGER `InvoiceItem_After_Insert` AFTER INSERT ON `invoiceItem`
FOR EACH ROW
BEGIN
SET @InvoiceNumber = NEW.InvoiceFK;
SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber);
UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber;
END
//
DELIMITER ;
-- after_update trigger for InvoiceItem to Calculate the Total in Invoice
------------------------------------------------------------------------
DELIMITER //
CREATE TRIGGER `InvoiceItem_After_Update` AFTER UPDATE ON `invoiceitem`
FOR EACH ROW
BEGIN
SET @InvoiceNumber = NEW.InvoiceFK;
SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber);
UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber;
END
//
DELIMITER ;
-- after_delete trigger for InvoiceItem to Calculate the Total in Invoice
----------------------------------------------------------------------
DELIMITER //
CREATE TRIGGER `InvoiceItem_After_Delete` AFTER DELETE ON `invoiceItem`
FOR EACH ROW
BEGIN
SET @InvoiceNumber = OLD.InvoiceFK;
SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber);
UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber;
END
//
DELIMITER ;
-----------------------------------------------------------------
接下来的2个触发器只是单个声明,并计算“扩展”' InvoceItem表中的列
---------------------------------------------------------------------
-- Calculate new 'Extended' price before insert
CREATE TRIGGER `InvoiceItem_Before_Insert` BEFORE INSERT ON `invoiceitem`
SET NEW.Extended = ROUND(NEW.Quantity * NEW.Price,2)
-------------------------------------------------------------------
-- Calculate new 'Extended' price before update
CREATE TRIGGER `InvoiceItem_Before_Update` BEFORE UPDATE ON `InvoiceItem`
FOR EACH ROW
SET NEW.Extended = ROUND(NEW.Quantity * NEW.Price,2);