MySQL触发器插入null而不是值

时间:2018-08-15 09:39:29

标签: mysql triggers

我在理解触发器如何在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触发器中,但这导致了另一个错误。我没看到什么,该如何解决?

1 个答案:

答案 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触发器进行相同的操作。