Mysql

如果使用部分,MySQL 使用觸發器更新另一個表上的數量

  • April 16, 2019

我是觸發器的新手,但想知道如何在我的數據庫中使用觸發器。我為維護日誌、零件庫存和parts_used 聯結表創建了一個表。進行維護時,將元件和日誌 ID 插入到parts_used 中。我希望能夠從該零件的庫存數量中減去 1。

維護日誌

CREATE TABLE maintenance_log (
   idlog int  (4) AUTO_INCREMENT,
   idVehicle int (2),
   description VARCHAR (80),
   entry_date DATE(),
   release_date DATE,
   idMechanic int (2),
   FOREIGN KEY (idVehicle) REFERENCES vehicles(idVehicle),
   FOREIGN KEY (idMechanic) REFERENCES mechanics(idMechanic),
PRIMARY KEY (idlog)
);

部分

   CREATE TABLE parts (
   idParts int(3) AUTO_INCREMENT,
   part_description VARCHAR (60),
   quantity int (2),
PRIMARY KEY (idParts)
);

使用過的零件

CREATE TABLE parts_used(
   idParts int (3),
   idlog int  (4),
CONSTRAINT PK_partUsed PRIMARY KEY
   (
       idParts,
       idlog
   ),
   FOREIGN KEY (idParts) REFERENCES parts(idParts),
   FOREIGN KEY (idlog) REFERENCES maintenance_log (idlog)
);

我目前的觸發器只返回 ERROR 而沒有其他消息。這就是我正在使用的。

CREATE TRIGGER subtract_quantity
AFTER INSERT ON parts_used FOR EACH ROW
BEGIN
          UPDATE parts
          SET parts.quantity = parts.quantity - 1
          WHERE parts.idParts = NEW.idParts
END

DELIMITER ;

任何人都可以提供幫助或提供任何建議嗎?

您需要在語句之前之後都有DELIMITER指令,您需要以分號結束單個簡單語句,並且您需要使用第一個指令中指定的分隔符來結束完整:CREATE TRIGGER``CREATE TRIGGER``DELIMITER

DELIMITER //

CREATE TRIGGER subtract_quantity
AFTER INSERT ON parts_used FOR EACH ROW
BEGIN
 UPDATE parts
   SET parts.quantity = parts.quantity - 1
   WHERE parts.idParts = NEW.idParts;
END
//

DELIMITER ;

但是,在這種情況下,您的整個觸發器主體是一個UPDATE語句,因此您可以省略BEGIN ... END語句和DELIMITER指令:

CREATE TRIGGER subtract_quantity
AFTER INSERT ON parts_used FOR EACH ROW
 UPDATE parts
   SET parts.quantity = parts.quantity - 1
   WHERE parts.idParts = NEW.idParts;

(這些DELIMITER指令允許解析器區分複合語句觸發器或過程主體的結尾和它包含的單個簡單語句的結尾,並且只有某些 MySQL 客戶端需要。)

引用自:https://dba.stackexchange.com/questions/126113