Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка в израза за разделител на MySQL

Изглежда, че това е дубликат на Възпроизвеждане на еволюция на рамка 2.0 и създаване на тригер (Обърнете внимание, че според мен по-добрият отговор е този, публикуван от Роджър на 24 май 2013 г., т.е. връзката по-горе)

"разделител" не може да се използва в текста на еволюционния скрипт; Изглежда не мога да намеря никаква документация защо това е така. Но може би това е свързано с факта, че "разделител" не е SQL израз, а SQL свойство.

Въпреки това, има решение в раздел „Еволюции“ на Play 2 docs :

Play разделя вашите .sql файлове на поредица от изрази, разделени с точка и запетая, преди да ги изпълни един по един в базата данни. Така че, ако трябва да използвате точка и запетая в израз, избягайте от него, като въведете;; вместо;. Например, INSERT INTO пунктуация(име, знак) VALUES ('точка и запетая', ';;');.

Така че във вашия случай,

  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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Печат за време за създаване на ред и последна промяна

  2. Бройте поява в таблицата PHP echo

  3. UPDATE с ORDER BY и LIMIT не работи в MYSQL

  4. mysql, транспониране/завъртане на ред в колона, избор на променлива

  5. MySQL:Име на първичния ключ в израза CREATE TABLE