我一直在试图让使用播放2.0.3创建此触发。 它运行在MySQL完全正常,如果我手动运行它,但试图从游戏运行它时,它失败。
delimiter |
create trigger company_updated before update on company
for each row begin
set new.updated = CURRENT_TIMESTAMP;
end;
|
delimiter ;
它抛出的错误是这样的:
我们得到了以下错误:您的SQL语法错误; 检查对应于你的MySQL服务器版本的手册正确的语法使用近“分隔符| CREATE TRIGGER在1号线更新之前company_updated对公司的每一行” [错误:1064 SQLSTATE:42000],试图运行该SQL脚本:
该delimiter
的关键字是不是一个SQL语句,它只是在mysql命令行客户端使用。
尝试删除delimiter
部分:
create trigger company_updated before update on company
for each row begin
set new.updated = CURRENT_TIMESTAMP;
end;
但正如你所说,你可能会碰到一个游戏漏洞与分号 :(
过去,这是一个错误,并已被固定在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;
这似乎是我们不能真正解决的限制。 所以,我们目前在我们的应用程序只是不支持触发器。 相反,我们只是重写我们的模型的保存/更新方法...
@Override
public void save() {
this.updated = new Date();
this.created = this.updated;
super.save();
}
@Override
public void update() {
this.updated = new Date();
super.update();
}
没有必要为一个分隔符声明。 比赛将您的文件拆分成多个查询,一个文件被结束了“;” 字符。
如果你想创建一个复杂的触发,你并不想打一个分号后您的文件分割,所以你有两个分号转义“;;”。
你最终每个查询有一个分号和触发器中结束了用双分号查询。
例如:
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;