【问题标题】:Error when If_Else used in triggers在触发器中使用 If_Else 时出错
【发布时间】:2014-09-21 14:24:00
【问题描述】:

请参考下图

我想在Ongoing_Fees 表上创建一个After Insert 触发器,用于更新VAT 表。但是在将数据插入增值税表之前,它应该检查特定PortfolioVAT 字段是否为trueOngoing_Fees 表拥有foreign keyPortfolio 表的访问权限,因此可以访问相关的投资组合。

以下是我尝试过的

DELIMITER $$
CREATE TRIGGER `Ongoing_Fees_AINS` AFTER INSERT ON `Ongoing_Fees` FOR EACH ROW
BEGIN
DECLARE `vat` Boolean;
`vat` = SELECT VAT from Portfolio WHERE Portfolio.idPortfolio = New.idPortfolio;

IF (`vat` == true) THEN
    INSERT INTO VAT VALUES (100, current_Timestamp, New.idPortfolio, New.idOngoing_Fees)
END;

当然,它有一个错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= SELECT VAT from Portfolio WHERE Portfolio.idPortfolio = New.idPortfolio;

【问题讨论】:

    标签: mysql sql database triggers insert


    【解决方案1】:

    试试:

    DELIMITER $$
    
    CREATE TRIGGER `Ongoing_Fees_AINS` AFTER INSERT ON `Ongoing_Fees`
    FOR EACH ROW
    BEGIN
      DECLARE `_vat` BOOL;
      SET `_vat` := (SELECT `VAT` FROM `Portfolio` WHERE `Portfolio`.`idPortfolio` = NEW.`idPortfolio`);    
      IF (`_vat` = TRUE) THEN
        INSERT INTO `VAT` (
             `Amount`,
             `current_timestamp`,
             `Portfolio_idPortfolio`,
             `Ongoing_Fees_idOngoing`
        )
        VALUES (
             100,
             CURRENT_TIMESTAMP(),
             NEW.`idPortfolio`,
             NEW.`idOngoing_Fees`
        );
      END IF;
    END$$
    
    DELIMITER ;
    

    更短的版本:

    DELIMITER $$
    
    CREATE TRIGGER `Ongoing_Fees_AINS` AFTER INSERT ON `Ongoing_Fees`
    FOR EACH ROW
    BEGIN
        INSERT INTO `VAT` (
             `Amount`,
             `current_timestamp`,
             `Portfolio_idPortfolio`,
             `Ongoing_Fees_idOngoing`
        )
        SELECT
             100,
             CURRENT_TIMESTAMP(),
             NEW.`idPortfolio`,
             NEW.`idOngoing_Fees`
        FROM
             DUAL
        WHERE
             TRUE = (SELECT
                          `VAT`
                     FROM
                          `Portfolio`
                     WHERE
                          `Portfolio`.`idPortfolio` = NEW.`idPortfolio`
                    );
    END$$
    
    DELIMITER ;
    

    【讨论】:

    • IF 的语法是IF ... THEN ... END IF。我看到变量的重命名已经完成,因为局部变量不应该与表或列同名。
    • @Sniper:更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多