在mySQL中触发以更新列值

时间:2017-03-21 02:47:56

标签: mysql database triggers

我写了这个触发器,根据客户的收入来更新列......

CREATE TRIGGER `TRG_CUST_CODE` BEFORE INSERT ON `CUSTOMER_DIM`
 FOR EACH ROW SET NEW.CUST_INCOME_AM = IF(NEW.CUST_INCOME_AM >= 55000, "H",
                        IF(NEW.CUST_INCOME_AM >= 40000 and NEW.CUST_INCOME_AM < 55000, "M",
                            IF(NEW.CUST_INCOME_AM >= 15000 AND NEW.CUST_INCOME_AM < 40000, "L","P"))
                        )

然而,所有的值都设置为P ......我错过了一些我在看的东西吗?

2 个答案:

答案 0 :(得分:0)

我不能代表您的数据,但我会将此触发器写为:

CREATE TRIGGER `TRG_CUST_CODE` BEFORE INSERT ON `CUSTOMER_DIM`
FOR EACH ROW
BEGIN
    SET NEW.CUST_INCOME_AM = (CASE WHEN NEW.CUST_INCOME_AM >= 55000
                                   THEN 'H'
                                   WHEN NEW.CUST_INCOME_AM >= 40000 and NEW.CUST_INCOME_AM < 55000
                                   THEN 'M'
                                   WHEN NEW.CUST_INCOME_AM >= 15000 AND NEW.CUST_INCOME_AM < 40000
                                   THEN 'L'
                                   ELSE 'P'
                              END);
END;

答案 1 :(得分:0)

你要替换这个值有点奇怪。这不是无效的,只是看起来有点奇怪。

表达式正在测试列CUST_INCOME_AM的值,然后为该列分配值。

鉴于您报告结果返回为“P”,表明该列是字符数据类型(例如CHAR或VARCHAR)。

您确定要与数字值进行比较吗?

通常,我们希望有一个我们正在比较的数字(例如INTEGER,DECIMAL)列。

  DELIMITER $$

  DROP TRIGGER IF EXISTS `TRG_CUST_CODE` $$

  CREATE TRIGGER `TRG_CUST_CODE`
  BEFORE INSERT ON `CUSTOMER_DIM`
  FOR EACH ROW
  BEGIN
    SET NEW.varchar_col
      = IF(NEW.numeric_col >= 55000
          ,'H'
          ,IF(NEW.numeric_col >= 40000
             ,'M'
             ,IF(NEW.numeric_col >= 15000
                ,'L'
                ,'P'
              )
           )
        );
  END$$

  DELIMITER ;