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

MySQL afgrænser sætningsfejl

Dette ser ud til at være en kopi af Afspil framework 2.0-evolutioner og opret trigger (Bemærk, at efter min mening er det bedre svar det, der blev indsendt af Roger den 24. maj 2013, dvs. linket ovenfor)

"delimiter" kan ikke bruges i evolution script-teksten; Jeg kan tilsyneladende ikke finde nogen dokumentation for, hvorfor det er sådan. Men måske hænger det sammen med, at "afgrænser" ikke er en SQL-sætning, men en SQL-egenskab.

Der er dog en løsning i Evolutions-sektionen i Play 2-dokumenter :

Play opdeler dine .sql-filer i en række semikolon-separerede sætninger, før de udføres én efter én mod databasen. Så hvis du skal bruge et semikolon i et udsagn, skal du undslippe det ved at indtaste;; i stedet for;. F.eks. INSERT INTO tegnsætning(navn, tegn) VÆRDIER ('semikolon', ';;');.

Så i dit tilfælde,

  1. Fjern egenskaben "afgrænser", og
  2. Brug ";;" i stedet for ";" for dit indre SQL-sætninger, for at forhindre Play 2-parseren i at udføre disse indre SQL-sætninger separat.

Her er et eksempel, som jeg med succes har testet i Play 2.3 og 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;

I tilfælde af dit SQL-script burde følgende fungere med Play 2.1 og nyere (Bemærk, at jeg ikke har testet 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. Den parametriserede forespørgsel ..... forventer parameteren '@units', som ikke blev leveret

  2. Ret "FEJL 1054 (42S22):Ukendt kolonne "..." i "ordre clause", når du bruger UNION i MySQL

  3. VBA-kode for at tilføje sammenkædet tabel med primærnøgle

  4. Sådan finder du nth Row i MySQL