2017-07-17 81 views
0

我有兩個MySQL表更新一行:smsconsumptionsms表包含所有事務,而consumption表包含消耗的短消息的總和。插入或使用MySQL觸發

我的目標是能夠到現在的實際消費了一天,所以我只需要直接在consumption表檢查。 對於它,我試圖創建一個觸發器,它會驗證:

  1. 如果1天沒有行consumption表,然後插入新行
  2. 是否已經有日間行1,然後更新它

這裏我的代碼不能正常工作。

CREATE TRIGGER tg_new_sms_sent 
AFTER INSERT ON sms 
FOR EACH ROW 
    SET @k = (SELECT id FROM consumption WHERE period = NEW.simple_date); 
    CASE 
     WHEN ISNULL(@k) THEN 
      INSERT INTO consumption (system_id, period, credit, sms) 
      VALUES (NEW.system_id, NEW.simple_date, NEW.used_credit, NEW.sms_count); 
     ELSE 
      UPDATE consumption SET credit = credit + New.used_credit, sms = sms + NEW.sms_count WHERE (system_id = NEW.system_id) AND (period = NEW.simple_date); 
    END CASE 

我該怎麼辦?

+0

什麼是不工作?你的觸發器還是不能添加觸發器? – money

+0

請爲表格添加表格結構。 –

+0

@money,當我執行上述代碼時出現錯誤 – nekiala

回答

1

試試下面的代碼。

DELIMITER $$ 
CREATE TRIGGER tg_new_sms_sent 
AFTER INSERT ON sms 
FOR EACH ROW 
    BEGIN 
    DECLARE num_rows INT; 

    SELECT COUNT(id) INTO num_rows FROM consumption 
    WHERE system_id = NEW.system_id AND period = NEW.simple_date; 

    IF num_rows = 0 THEN 
     INSERT INTO consumption (system_id, period, credit, sms) 
     VALUES (NEW.system_id, NEW.simple_date, NEW.used_credit, NEW.sms_count); 
    ELSE 
     UPDATE consumption 
     SET credit = credit + NEW.used_credit, sms = sms + NEW.sms_count 
     WHERE system_id = NEW.system_id AND period = NEW.simple_date; 
    END IF; 

    END$$ 
DELIMITER ; 
+0

謝謝@Keyur – nekiala

+0

請注意,您必須在您的''WHERE'查詢SELECT'條件使用'SYSTEM_ID = NEW.system_id'。否則,使用您選擇的解決方案,您可能會計數> 0,但如果使用該「id」的記錄不在「消費」中,則您的「UPDATE」將失敗。 –

+0

你是對的!由於 – nekiala

1
DELIMITER $$ 
CREATE TRIGGER tg_new_sms_sent AFTER INSERT ON sms 
FOR EACH ROW 
BEGIN 
DECLARE VAR_CNT INT; 
     SELECT id INTO VAR_CNT FROM consumption WHERE period = NEW.simple_date AND system_id = NEW.system_id; 

     IF VAR_CNT = 0 THEN 
     INSERT INTO consumption (system_id, period, credit, sms) 
     VALUES (NEW.system_id, NEW.simple_date, NEW.used_credit, NEW.sms_count); 
     ELSE 
     UPDATE consumption SET credit = credit + New.used_credit, sms = sms + NEW.sms_count WHERE (system_id = NEW.system_id) AND (period = NEW.simple_date); 
     END IF ; 

END;$$ 

DELIMITER ; 

試試上面的查詢。

希望這會幫助你

+0

謝謝@Sagar。有效! – nekiala

+0

@nekiala你爲什麼不接受我的回答?即使我在28分鐘前給出了它.. –

+0

嗨@Sagar,你的代碼運行良好。我剛剛注意到,當一個新行被插入到'sms'表中時,觸發器在'consumption'表中爲同一個'period'插入一個新行,而不是更新現有行。 – nekiala