gpt4 book ai didi

MySQL分隔符语句错误

转载 作者:行者123 更新时间:2023-11-29 04:42:30 26 4
gpt4 key购买 nike

我正在尝试在 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 中运行它时,它工作正常,但是当 Play 2 自动运行它时(在一个名为 2.sql 的文件中)我得到以下错误:

您的 SQL 语法有误;检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行 [ERROR:1064, SQLSTATE:42000] 处的“DELIMITER $$$ DROP TRIGGER IF EXISTS invoice_line_insert $$$ CREATE TRIGGER invo”附近使用的正确语法 [ERROR:1064, SQLSTATE:42000],同时尝试运行此 SQL 脚本:

我在网上看到,分隔符语句只对特定的图形用户界面有效,不是每次都有效。真的吗 ?为什么 ?我需要分隔符语句,如何解决?

感谢您的帮助。

最佳答案

这似乎是 Play framework 2.0 evolutions and create trigger 的副本(请注意,在我看来,更好的答案是 Roger 在 2013 年 5 月 24 日发布的那个,即上面的链接)

进化脚本文本中不能使用“定界符”;我似乎找不到任何文档来说明为什么会这样。但也许这与“定界符”不是 SQL 语句而是 SQL 属性这一事实有关。

但是,Evolutions section of Play 2 docs 中有一个解决方案。 :

Play 将您的 .sql 文件拆分为一系列以分号分隔的语句,然后再对数据库逐一执行。因此,如果您需要在语句中使用分号,请通过输入 ;; 将其转义。代替 ;。例如,INSERT INTO punctuation(name, character) VALUES ('semicolon', ';;');。

所以在你的情况下,

  1. 删除“分隔符”属性,并且
  2. 使用“;;”代替 ”;”用于您的内部 SQL 语句,以防止 Play 2 解析器单独执行这些内部 SQL 语句。

这是我在 Play 2.3 和 mysql 14.14 Distrib 5.5.40 (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 脚本,以下内容应该适用于 Play 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;

关于MySQL分隔符语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25604055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com