2012-01-16 46 views
0

我剛剛學習外鍵。我正在簡化我的表到這:使用外鍵在一個表中更新總數

Table: item 
Columns: item_id (PK), qty 

Table: item_change_log 
Columns: id (PK), item_id (indexed), change_value 

這兩個表都是INNODB。

每次在項目層面做出改變,改變的數量被記錄在item_change_log.change_value。我想change_value自動添加/減去item.qty

預期的行爲:

用戶創建項目X. item.item_id = X, qty = 0。 item_change_log中尚未記錄任何記錄。 用戶將手頭的X數量改爲2. item_change_log: id = 1, item_id = X, change_value = 2。這個change_value通過外鍵自動增加item.qty = 2

我知道如何使該項目的ID看到對方的外鍵,但我不知道如何添加「數學」元素;如果這是可能的。

謝謝!

回答

3

你需要的是一個觸發,但?

  • 既然是item_change_log表用戶實際修改, 您需要item_change_log
  • 觸發既然你八方通插入item_change_log,你需要一個INSERT 觸發
  • 因爲你只需要更新項目只是,如果插入到item_change_log 真正的作品,你想要一個AFTER INSERT觸發器

所以在這裏我們去

CREATE TRIGGER update_item_table AFTER INSERT ON item_change_log 
    FOR EACH ROW BEGIN 
    UPDATE item SET qty=qty+NEW.qty WHERE item_id=NEW.item_id; 
    END; 
+0

+1但是沒有必要'BEGIN'和'END'在這裏,因爲它是一個行語句。 – netcoder 2012-01-16 16:54:33

+0

@netcoder當然你是對的,我想我的手指在觸發開始時鍵入「FOR EACH ROW BEGIN」,而沒有與大腦交互。不更新我的代碼 - 這將殺死你的評論的上下文。 – 2012-01-16 17:03:46

3

這是無法通過外鍵處理。但是,你看着creating a triggeritem_change_log表每當行插入,將更新item