Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi câu lệnh dấu phân tách MySQL

Đây dường như là bản sao của các diễn biến của Play framework 2.0 và tạo trình kích hoạt (Lưu ý rằng, theo quan điểm của tôi, câu trả lời hay hơn là câu trả lời được đăng bởi Roger vào ngày 24 tháng 5 năm 2013, tức là liên kết ở trên)

"dấu phân tách" không thể được sử dụng trong văn bản tập lệnh tiến hóa; Tôi dường như không thể tìm thấy bất kỳ tài liệu nào giải thích tại sao lại như vậy. Nhưng có lẽ nó liên quan đến thực tế là "dấu phân tách" không phải là một câu lệnh SQL mà là một thuộc tính SQL.

Tuy nhiên, có một giải pháp trong phần phần Diễn biến của tài liệu Play 2 :

Play tách các tệp .sql của bạn thành một loạt các câu lệnh được phân tách bằng dấu chấm phẩy trước khi thực thi từng câu một trên cơ sở dữ liệu. Vì vậy, nếu bạn cần sử dụng dấu chấm phẩy trong một câu lệnh, hãy thoát nó bằng cách nhập;; thay vì;. Ví dụ:CHÈN VÀO dấu câu (tên, ký tự) GIÁ TRỊ ('dấu chấm phẩy', ';;');.

Vì vậy, trong trường hợp của bạn,

  1. Xóa thuộc tính "dấu phân cách" và
  2. Sử dụng ";;" thay vì ";" cho nội tâm của bạn Câu lệnh SQL, để ngăn trình phân tích cú pháp Play 2 thực thi các câu lệnh SQL bên trong này một cách riêng biệt.

Đây là một ví dụ mà tôi đã thử nghiệm thành công trong Play 2.3 và 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;

Trong trường hợp tập lệnh SQL của bạn, phần sau sẽ hoạt động với Play 2.1 trở lên (Lưu ý rằng tôi chưa thử nghiệm nó):

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. Lỗi câu lệnh chuẩn bị sẵn mysql:MySQLSyntaxErrorException

  2. Nội dung của một tuyên bố chuẩn bị như thế nào?

  3. MySQL so với MariaDB

  4. mysql -> chèn vào tbl (chọn từ bảng khác) và một số giá trị mặc định

  5. Hoạt động gần đây của người dùng - PHP MySQL