Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Błąd instrukcji separatora MySQL

To wydaje się być duplikatem Graj w ewolucje frameworku 2.0 i utwórz wyzwalacz (Zauważ, że moim zdaniem lepszą odpowiedzią jest ta opublikowana przez Rogera 24 maja 2013 r., tj. powyższy link)

„delimiter” nie może być użyty w tekście skryptu ewolucji; Nie mogę znaleźć żadnej dokumentacji wyjaśniającej, dlaczego tak jest. Ale może ma to związek z faktem, że „delimiter” nie jest instrukcją SQL, ale właściwością SQL.

Istnieje jednak rozwiązanie w sekcji Ewolucje w dokumentacji Play 2 :

Play dzieli pliki .sql na serię instrukcji rozdzielonych średnikami przed wykonaniem ich pojedynczo w bazie danych. Jeśli więc potrzebujesz użyć średnika w wyrażeniu, pomiń go, wpisując;; zamiast;. Na przykład INSERT INTO interpunkcja(nazwa, znak) WARTOŚCI ('średnik', ';;');.

Więc w twoim przypadku

  1. Usuń właściwość „delimiter” i
  2. Użyj „;;” zamiast ";" dla twojego wewnętrznego Instrukcje SQL, aby uniemożliwić parserowi Play 2 oddzielne wykonywanie tych wewnętrznych instrukcji SQL.

Oto przykład, który z powodzeniem przetestowałem w Play 2.3 i 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;

W przypadku twojego skryptu SQL, poniższe powinny działać z Play 2.1 i nowszymi (pamiętaj, że tego nie testowałem):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak porównywać wydajność MySQL za pomocą SysBench?

  2. Dlaczego rozmiar mojego stołu jest ponad 4 razy większy niż oczekiwano? (wiersze*bajty/wiersz)

  3. Dodaj nową kolumnę do bazy danych wordpress

  4. Gdzie jest odpowiednik MySql 5.6 `MySQLInstanceConfig.exe` do edycji plików konfiguracyjnych?

  5. Jak podzielić ciąg w MySQL