PHPmyAdmin mySQL触发器:插入,更新或删除子表时更新父表

时间:2016-02-21 22:16:14

标签: mysql phpmyadmin

我需要一些帮助来获得正确的语法来定义PHPmyAdmin中的触发器。 是)我有的: 2个表 - 发票和invoiceitem tbl_invoice有一个字段'Total',它应该显示表invoiceitem的'Extended'价格的总和

tbl_invoiceitem有2个触发器,用于更新'Extended'forest_insert和before_update

我尝试完成的任务:

计算发票的所有项目的总和,并在插入新项目或更新现有项目的价格或数量后更新tbl_invoice中的“总计”价格。

我尝试在PHPmyAdmin中执行此操作。

enter image description here

错误消息是

enter image description here

我希望有人能给出一个正确方向的暗示。刚开始使用触发器,似乎没有找到解决方案,只需要几天的时间搜索互联网。

提前感谢您的帮助。

干杯,奥利弗

2 个答案:

答案 0 :(得分:1)

我的代码中可以看到2个语法错误:

  1. 分隔符命令应该在触发器定义之外,而不是在其内部。 Phpmyadmin应该照顾好这一点。

  2. begin ... end块中的命令应以分号(;)结束,而不是在delimiter命令中提供的任何内容。

  3. 我没有检查触发器中的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);