Mysql
 sql >> Database >  >> RDS >> Mysql

Errore di istruzione del delimitatore MySQL

Questo sembra essere un duplicato di Riproduci le evoluzioni del framework 2.0 e crea un trigger (Nota che, a mio avviso, la risposta migliore è quella postata da Roger il 24 maggio 2013, ovvero il link sopra)

"delimitatore" non può essere utilizzato nel testo dello script di evoluzione; Non riesco a trovare alcuna documentazione sul motivo per cui è così. Ma forse ha a che fare con il fatto che "delimiter" non è un'istruzione SQL ma una proprietà SQL.

Tuttavia, c'è una soluzione nella sezione Evoluzioni dei documenti di Play 2 :

Play divide i tuoi file .sql in una serie di istruzioni delimitate da punto e virgola prima di eseguirle una alla volta sul database. Quindi, se è necessario utilizzare un punto e virgola all'interno di un'istruzione, esegui l'escape inserendo;; invece di;. Ad esempio, INSERT INTO punteggiatura(nome, carattere) VALUES ('punto e virgola', ';;');.

Quindi nel tuo caso,

  1. Rimuovi la proprietà "delimiter" e
  2. Usa ";;" invece di ";" per il tuo interno istruzioni SQL, in modo da impedire al parser di Play 2 di eseguire separatamente queste istruzioni SQL interne.

Ecco un esempio che ho testato con successo in Play 2.3 e 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;

Nel caso del tuo script SQL, quanto segue dovrebbe funzionare con Play 2.1 e versioni successive (nota che non l'ho testato):

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;