sql >> Databasteknik >  >> RDS >> Mysql

MySQL-avgränsningssatsfel

Detta verkar vara en dubblett av Spela framework 2.0-utvecklingar och skapa trigger (Observera att enligt min åsikt är det bättre svaret det som Roger postade den 24 maj 2013, dvs. länken ovan)

"avgränsare" kan inte användas i evolutionens skripttext; Jag kan inte hitta någon dokumentation om varför det är så. Men det kanske har att göra med att "avgränsare" inte är en SQL-sats utan en SQL-egenskap.

Det finns dock en lösning i avsnittet Evolutions i Play 2 docs :

Play delar upp dina .sql-filer i en serie semikolonavgränsade satser innan de körs en i taget mot databasen. Så om du behöver använda semikolon i ett uttalande, undvik det genom att ange;; istället för;. Till exempel, INSERT INTO interpunktion(namn, tecken) VÄRDEN ('semikolon', ';;');.

Så i ditt fall,

  1. Ta bort egenskapen "avgränsare" och
  2. Använd ";;" istället för ";" för ditt inre SQL-satser, för att förhindra att Play 2-parsern exekverar dessa inre SQL-satser separat.

Här är ett exempel som jag framgångsrikt har testat i Play 2.3 och 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;

När det gäller ditt SQL-skript bör följande fungera med Play 2.1 och högre (Observera att jag inte har testat det):

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. Säkra MySQL-säkerhetskopior:En guide

  2. Hur man döljer SQL-databaser som en användare inte har tillgång till

  3. min transaktion återställs inte när något går fel i C# med mysql?

  4. PHP-anslutningen misslyckades:SQLSTATE[HY000] [2002] Anslutningen avvisades