sql >> Databáze >  >> RDS >> Mysql

Chyba příkazu oddělovače MySQL

Zdá se, že jde o duplikát evoluce rámce Play 2.0 a vytvoření spouštěče (Všimněte si, že podle mého názoru je lepší odpověď ta, kterou napsal Roger 24. května 2013, tedy odkaz výše)

"oddělovač" nelze použít v textu evolučního skriptu; Nemohu najít žádnou dokumentaci, proč tomu tak je. Ale možná to souvisí se skutečností, že "oddělovač" není příkaz SQL, ale vlastnost SQL.

Existuje však řešení v sekci Evolutions dokumentu Play 2 :

Play rozdělí vaše soubory .sql na řadu příkazů oddělených středníkem a poté je spustí jeden po druhém v databázi. Pokud tedy potřebujete v příkazu použít středník, ukončete jej zadáním;; namísto;. Například INSERT INTO interpunkce (jméno, znak) VALUES ('středník', ';;');.

Takže ve vašem případě

  1. Odeberte vlastnost "delimiter" a
  2. Použijte ";;" namísto ";" pro vaše vnitřní Příkazy SQL, aby se zabránilo analyzátoru Play 2 provádět tyto vnitřní příkazy SQL samostatně.

Zde je příklad, který jsem úspěšně testoval v Play 2.3 a 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;

V případě vašeho SQL skriptu by následující mělo fungovat se službou Play 2.1 a vyšší (Všimněte si, že jsem to netestoval):

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. Export a import všech databází MySQL najednou

  2. Spusťte pro vynucení vztahu M-M

  3. Hibernate vrátí seznam s hodnotami null (anotace OneToMany s typem List)

  4. Mohu v MySQL zkopírovat jeden řádek pro vložení do stejné tabulky?