2014-09-01 71 views
1

我想在mysql中运行以下脚本:MySQL的分隔符语句错误

DELIMITER $$$ 
DROP TRIGGER IF EXISTS invoice_line_insert 
$$$ 
CREATE TRIGGER invoice_line_insert AFTER INSERT 
ON invoice_line FOR EACH ROW 
BEGIN 
    IF NEW.type = "DELIVERY" THEN 
     UPDATE invoice 
     SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount 
     WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice; 
    ELSE 
     UPDATE invoice 
     SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount 
     WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice; 
    END IF; 
    UPDATE invoice 
    SET invoice.vatamount = (NEW.amount * ((
       SELECT vat.rate 
       FROM vat 
       WHERE vat.id_vat = NEW.vat_id_vat 
    )/100)) + invoice.vatamount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice; 

    UPDATE invoice 
    SET invoice.itamount = invoice.vatamount + 
      invoice.etdelivery_amount + 
      invoice.etexpense_amount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice; 
END 
$$$ 

当我在MySQL Workbench中运行它,它工作正常,但是当比赛2来看,它authomatically(在一个名为2.sql)我收到以下错误:

您的SQL语法错误;请检查与您的MySQL服务器版本相对应的手册,以便在第1行[错误:1064,SQLSTATE:42000]处使用'DELIMITER $$$ DROP TRIGGER IF EXTRTS invoice_line_insert $$$ CREATE TRIGGER invo'附近的正确语法运行这个SQL脚本:

我在网上看到,分隔符语句只针对特定的gui,而不是每次。真的吗 ?为什么?如何解决它,因为我需要分隔符语句?

感谢您的帮助。

+0

你不需要第二个分隔符'DROP TRIGGER IF EXISTS invoice_line_insert $$$'删除其已经存在的顶部。 – 2014-09-01 10:49:29

+0

@AhhikChakraborty谢谢,但它没有解决问题。 – Moebius 2014-09-01 10:54:01

+0

在第一个语句之后添加一个';'DROP TRIGGER IF EXUSTS invoice_line_insert;' – 2014-09-01 10:57:03

回答

4

这似乎是Play framework 2.0 evolutions and create trigger 重复(需要注意的是,在我看来,更好的答案是一个发布由Roger于2013年5月24日,也就是上面的链接)“分隔符”不能用

在进化脚本文本中;我似乎无法找到任何文件,为什么这是如此。但也许这与“分隔符”不是SQL语句而是SQL属性有关。

然而,在Evolutions section of Play 2 docs的解决方案:

播放一个接一个对数据库执行之前将您的.sql文件成一系列分号分隔的语句。因此,如果您需要在语句中使用分号,请输入;;来避免它。代替 ;。例如,INSERT INTO标点符号(名称,字符)VALUES('分号',';;');.你的情况

所以,

  1. 去掉 “分隔符” 属性,
  2. 使用 “;;”代替 ”;”为了让你的内部的 SQL语句,以防止Play 2解析器单独执行这些内部SQL语句。

下面是我在玩2.3测试成功的例子和MySQL 14.14 DISTRIB 40年5月5日(Ubuntu的12.04LTS):

DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER; 
CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER 
BEFORE INSERT ON SOFTWARE 
FOR EACH ROW 
BEGIN 
    IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN 
    SET NEW.CREATED_TIME = NOW();; 
    END IF;; 
END; 

在SQL脚本的情况下,以下应该工作与播放2.1及以上(请注意,我没有测试过):

DROP TRIGGER IF EXISTS invoice_line_insert; 
CREATE TRIGGER invoice_line_insert AFTER INSERT 
ON invoice_line FOR EACH ROW 
BEGIN 
    IF NEW.type = "DELIVERY" THEN 
    UPDATE invoice 
    SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;; 
    ELSE 
    UPDATE invoice 
    SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;; 
    END IF;; 
    UPDATE invoice 
    SET invoice.vatamount = (NEW.amount * ((
    SELECT vat.rate 
    FROM vat 
    WHERE vat.id_vat = NEW.vat_id_vat 
)/100)) + invoice.vatamount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;; 

    UPDATE invoice 
    SET invoice.itamount = invoice.vatamount + 
    invoice.etdelivery_amount + 
    invoice.etexpense_amount 
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;; 
END;