具有IF条件的MYSQL TRIGGER

时间:2016-05-10 08:25:24

标签: mysql triggers

我是一个菜鸟MYSQL,我试图触发一个会在发票表中自动填写2个字段(customername,customersurname)的触发器。 anyoane可以解释一下我在那个触发器中做错了吗?非常感谢你! :)

CREATE TABLE customer(
  customerID INT(6) PRIMARY KEY AUTO_INCREMENT,
  customername VARCHAR(20) NOT NULL,
  customersurname VARCHAR(20) NOT NULL,
  customeraddress VARCHAR(200)
);

CREATE TABLE invoice(
  invoiceID INT (6) Primary KEY AUTO_INCREMENT,
  customerID INT (6) REFERENCES customer(customerID),
  customername VARCHAR(20) REFERENCES customer(customername), 
  invoicedate DATE,
  orderID INT(6) REFERENCES orders(orderID),
  products VARCHAR(200) REFERENCES orderlines(productname),
  FOREIGN KEY(orderID) REFERENCES orders(orderID)
);

CREATE TRIGGER autofill_invoice BEFORE INSERT ON invoice FOR EACH ROW
 BEGIN 
IF (new.customerID = customer.customerID,
    new.customersurname = customer.customersurname ) 
THEN 
     SET new.customername = customer.customername,
         new.customersurname = customer.customersurname;         
END IF;

END;

1 个答案:

答案 0 :(得分:0)

正如defining stored programs上的mysql文档所解释的那样:

  

如果使用mysql客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此必须临时重新定义分隔符以使mysql将整个存储的程序定义传递给服务器。

     

要重新定义mysql分隔符,请使用delimiter命令。该   以下示例显示了如何为dorepeat()过程执行此操作   刚刚显示。分隔符更改为//以启用整个分隔符   定义要作为单个语句传递给服务器,然后   恢复到;在调用该过程之前。这使得;   在程序体中使用的分隔符将被传递给   服务器,而不是由mysql本身解释。

因此,在定义存储过程时使用delimiter命令:

DELIMITER //

CREATE TRIGGER autofill_invoice BEFORE INSERT ON invoice FOR EACH ROW
 BEGIN 
IF (new.customerID = customer.customerID,
    new.customersurname = customer.customersurname ) 
THEN 
     SET new.customername = customer.customername,
         new.customersurname = customer.customersurname;         
END IF;

END//

DELIMITER ;

下次请在您的问题中提供准确的错误说明!