sql >> Database >  >> RDS >> Mysql

Fout in MySQL-scheidingsteken

Dit lijkt een duplicaat te zijn van Spel framework 2.0-evoluties af en creëer trigger (Merk op dat, naar mijn mening, het betere antwoord het antwoord is dat door Roger op 24 mei 2013 is gepost, d.w.z. de link hierboven)

"scheidingsteken" kan niet worden gebruikt in de tekst van het evolutiescript; Ik kan geen documentatie vinden waarom dit zo is. Maar misschien heeft het te maken met het feit dat "delimiter" geen SQL-statement is, maar een SQL-eigenschap.

Er is echter een oplossing in de Evolutions-sectie van Play 2-documenten :

Play splitst uw .sql-bestanden op in een reeks door puntkomma's gescheiden instructies voordat ze één voor één worden uitgevoerd op de database. Dus als je een puntkomma in een statement moet gebruiken, ontsnap er dan aan door;; in plaats van;. Bijvoorbeeld INSERT INTO interpunctie (naam, teken) VALUES ('puntkomma', ';;');.

Dus in jouw geval

  1. Verwijder de eigenschap "scheidingsteken" en
  2. Gebruik ";;" in plaats van ";" voor je innerlijke SQL-instructies, om te voorkomen dat de Play 2-parser deze interne SQL-instructies afzonderlijk uitvoert.

Hier is een voorbeeld dat ik met succes heb getest in Play 2.3 en 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;

In het geval van uw SQL-script zou het volgende moeten werken met Play 2.1 en hoger (merk op dat ik het niet heb getest):

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. Selecteer de eerste rij van elke groep in sql

  2. Wat zijn de use-cases voor het selecteren van CHAR boven VARCHAR in SQL?

  3. mysql-uitzondering onjuiste integerwaarde:'@column' voor kolom van asp.net-webtoepassing

  4. Mysql - Groeperen op maand met Y-m-d-formaat