2017-03-21 53 views
0

我寫了這個觸發更新基於客戶的收入列...觸發在MySQL中更新列中的值

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 ...我失去的東西我在看?

+0

給予一定的樣本數據 –

+0

CUST_INCOME_AM 28000大號56000^h應該是這樣的事情小於15000應設爲P –

回答

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; 
+0

我以前這樣嘗試,因爲這是W3學校建議,但MySQL的說,這是錯誤的語法 –

+0

@ZackBunch。 。 。也許你可能需要在定義觸發器之前設置分隔符。 –

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 ;