2017-02-25 135 views
0

我有一個表,我需要更新每次有東西插入到另一個表中。MySQL觸發器更新動態列

表要更新:counters插入sales。 問題是counters中將更新的列根據表sales中的插入而不同。

我一直在環顧四周,從昨天開始搜尋,但無濟於事。 我試過使用CAST(.. AS CHAR)函數,但無濟於事。

這是說法應該是什麼樣子:

CREATE TRIGGER `sales_AFTER_INSERT` AFTER INSERT ON `sales` FOR EACH ROW 
BEGIN 
    UPDATE counters SET {NEW.sale_provider} = {NEW.sale_provider} + NEW.sale_quantity WHERE counters.cnt_sendername = NEW.sale_sendername; 
END; 

其中{New.sale_provider}是要更新的列的名稱。

櫃檯表看起來像:

| sendername | prov1 | prov2 | prov3 | ...

其中列名(prov1,prov2 ..)是供應商

這是可能的id?我怎樣才能做到這一點? 我是觸發器的新手,仍然缺乏對SQL語言和MySQL功能的深入理解。

注:

  • 有4列作爲一個開始,因爲有4個供應商,計數器表供應快速訪問限制,而不是每次都計算它,這將是使用相當多並重新計算它每次都是非常耗費資源的。
  • 隨着每個新的提供者添加一個新的列將被添加到計數器表中,它也應該是可更新的,因此需要某種形式的變量。

您的幫助是最受讚賞!

編輯:

的一點是,更新的列每一次會有所不同,我知道這是不同尋常,但我認爲這是可行的非少。 插入到sales中的新數據將影響counter中的一列,但影響哪一列是需要確定的。

找了一段時間後,我發現一些東西,能解決什麼,我需要,但仍無法得到它的運行:

CREATE TRIGGER `sales_AFTER_INSERT` AFTER INSERT ON `sales` FOR EACH ROW 
BEGIN 
    SET colname= New.sale_provider; 
    UPDATE counters SET colname = colname + NEW.sale_quantity WHERE counters.cnt_sendername = NEW.sale_sendername; 
END; 

,但它告訴我,colname不是一個系統變量? 我一直在尋找如何分配一個變量,他們都看起來像我做了什麼,什麼是錯的?

+0

[加入MySQL的列的表使用觸發器(可能的重複http://stackoverflow.com/questions/42450231/adding-mysql-列表到觸發器) – Psi

+0

@Psi正在改變插入新列的表,這是更新現有列的名稱是可變的 - 完全不同。 – bakz

+1

同樣的答案:動態SQL不允許在觸發器中使用。列名在DDL中不可變,與表名相同 – Psi

回答

0

你可以做你想做一次更新是什麼,使用每列的條件:

CREATE TRIGGER `sales_AFTER_INSERT` AFTER INSERT ON `sales` FOR EACH ROW 
BEGIN 
    UPDATE counters c 
     SET prov1 = c.prov1 + (case when NEW.sale_provider = 'prov1' THEN NEW.sale_quantity else 0 end), 
      prov2 = c.prov2 + (case when NEW.sale_provider = 'prov2' THEN NEW.sale_quantity else 0 end), 
      prov3 = c.prov3 + (case when NEW.sale_provider = 'prov3' THEN NEW.sale_quantity else 0 end), 
      prov4 = c.prov4 + (case when NEW.sale_provider = 'prov4' THEN NEW.sale_quantity else 0 end)   
     WHERE c.cnt_sendername = NEW.sale_sendername; 
END; 

我也建議您更改表格讓每個供應商一行。這樣,你不必改變觸發增加新的供應商:

CREATE TRIGGER `sales_AFTER_INSERT` AFTER INSERT ON `sales` FOR EACH ROW 
BEGIN 
    UPDATE counters c 
     SET quantity = c.quantity + NEW.sale_quantity 
     WHERE c.cnt_sendername = NEW.sale_sendername AND 
       c.provider = NEW.sale_provider 
END; 

這使得查詢表作爲交叉表有點困難,但是這不是什麼大不了的事。

這兩者都假定counters已預先初始化爲所有需要的行。這可能不合理。所以,你應該在sales_after_insert(cnt_sendername, provider)創建唯一索引,並使用insert on duplicate key

CREATE TRIGGER `sales_AFTER_INSERT` AFTER INSERT ON `sales` FOR EACH ROW 
BEGIN 
    INSERT INTO counters(cnt_sendername, provider, quantity) 
     VALUES (NEW.sale_sendername, NEW.sale_provider, NEW.sale_quantity) 
     ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity); 
END; 
+0

這意味着我必須列出所有的提供者,這使得它是靜態的。如果添加一個新的提供者,我將不得不手動添加該條件到觸發器,我需要它是動態的 – bakz

+0

@bakz。 。 。那麼你有錯誤的數據結構。 –

+0

我並不是那種數據庫的經驗,但我知道我構造這種方式不是一種傳統的方式,但我知道我需要什麼但我沒有表達我的觀點,是否有可能將表格的名稱設置爲變量像在PHP中?我認爲MySQL支持變量 – bakz