我在理解触发器如何在MySQL中执行时遇到了麻烦,而且我一头撞墙,因为我似乎无法找出为什么它不起作用。
我有以下触发器
CREATE TRIGGER Insert_Products BEFORE INSERT ON `Products`
FOR EACH ROW BEGIN
DECLARE x_ProductID INT;
SET x_ProductID = NEW.`ProductID`;
SET NEW.`PriceExVAT` = (
SELECT
ROUND(p.`Price` * 100 / (100 + v.`VATPercentage`), 2) as priceexvat
FROM
`Products` p
LEFT JOIN
`VAT` v ON p.`VATID` = v.`VATID`
WHERE p.`ProductID` = x_ProductID); -- also tried inserting NEW.`ProductID` directly into this line
END $$
但是,它用null
而不是正确的值填充了我的行。但是,将其放在选择查询中会得到正确的值。 IE:
SELECT
ROUND(p.`Price` * 100 / (100 + v.`VATPercentage`), 2) as x_value
FROM
`Products` p
LEFT JOIN
`VAT` v ON p.`VATID` = v.`VATID`
WHERE p.`ProductID` = 1;
我尝试将其放在AFTER INSERT
触发器中,但这导致了另一个错误。我没看到什么,该如何解决?
答案 0 :(得分:1)
您不需要在product
表中查询当前插入的行的值:除了自动递增ID之外,它们都在NEW
中提供,您可以直接使用它们: / p>
SET NEW.`PriceExVAT` = (
SELECT ROUND(NEW.`Price` * 100 / (100 + v.`VATPercentage`), 2) as priceexvat
FROM `VAT` v
WHERE NEW.`VATID` = v.`VATID`
)
您可以通过before update
触发器进行相同的操作。