4

我一直在尝试使用 Play 2.0.3 创建此触发器。如果我手动运行它,它在 MySQL 中运行得非常好,但是在尝试从 Play 运行它时它会失败。

delimiter |
    create trigger company_updated before update on company
        for each row begin
            set new.updated = CURRENT_TIMESTAMP;
        end;
    |
delimiter ;

它抛出的错误是这样的:

我们收到以下错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“分隔符 |”附近使用的正确语法。在尝试运行此 SQL 脚本时,在第 1 行 [ERROR:1064, SQLSTATE:42000] 为每一行更新公司之前创建触发器 company_updated:

4

4 回答 4

6

这曾经是一个错误,并已在 2.1 中修复。您可以使用双分号进行转义。它记录在这里: http ://www.playframework.com/documentation/2.1.0/Evolutions

所以你的代码应该改变如下:

create trigger company_updated before update on company
    for each row begin
        set new.updated = CURRENT_TIMESTAMP;;
end;
于 2013-03-24T14:42:03.977 回答
3

delimiter关键字不是 SQL 语句,它只在 mysql 命令行客户端中使用。

尝试删除delimiter部分:

create trigger company_updated before update on company
    for each row begin
        set new.updated = CURRENT_TIMESTAMP;
    end;

但正如您所提到的,您可能会使用分号遇到Play 错误:(

于 2012-09-18T19:01:10.880 回答
0

这似乎是一个我们无法真正解决的限制。因此,我们目前只是不支持我们的应用程序中的触发器。相反,我们只是覆盖了模型的保存/更新方法......

@Override
public void save() {
    this.updated = new Date();
    this.created = this.updated;
    super.save();
}

@Override
public void update() {
    this.updated = new Date();
    super.update();
}
于 2012-09-18T20:20:36.060 回答
0

不需要分隔符语句。Play 会将您的文件拆分为多个查询,其中一个文件以“;”结尾 特点。

如果你想创建一个复杂的触发器,你不想在分号后分割你的文件,所以你用双分号“;;”转义它。

您以一个分号结束每个查询,并在触发器内以双分号结束您的查询。

例子 :

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
    )) + 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;
于 2014-09-17T08:04:02.257 回答