2012-08-28 150 views
1

有沒有一種方法可以使用MySQL的默認值屬性(即列定義的DEFAULT子句)基於同一表或不同表中某些其他列的值執行計算?在默認MySQL值中執行計算

我們可以設置任何列的靜態默認值,但我們可以執行計算或查詢其他表的數據?

編輯

比方說,列A表marks和其他與total_marks和第三列percentage。如何設置percentage的缺省值以從前兩列計算

+1

是的。如果你提供更多的信息,也許我們可以給你更多的想法。 – Kermit

回答

8

否。DEFAULT子句的值必須是常量。 (該一個例外是使用CURRENT_TIMESTAMP作爲用於TIMESTAMP列的默認值。)

作爲替代方案,可以使用觸發器來當一行被插入或更新的一列設置的值。

例如,在BEFORE INSERT FOR EACH ROW觸發器中,可以根據爲其他列提供的值和/或從其他表中查詢數據執行計算。


編輯

對於這個問題,一個例子起點觸發定義的編輯給出的例子:

CREATE TRIGGER mytable_bi 
BEFORE INSERT ON mytable 
FOR EACH ROW 
BEGIN 
    SET NEW.percentage = (100.0 * NEW.marks)/NULLIF(NEW.total_marks,0); 
END 
+1

我誤解了這個問題。使用觸發器是正確的答案! +1爲了解決問題:) – eggyal

+0

我也相信觸發器是要走的路,但我想知道如果默認值可以處理它。我想它不能。 – tGilani

+0

我在運行這個程序時遇到了麻煩,直到我理解了分隔符的問題。請參閱http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html,其中說「如果您使用mysql程序來定義執行多個語句的觸發器,則需要重新定義mysql語句分隔符,以便您可以在觸發器定義中使用;語句分隔符「。 –

0

引發劑溶液是偉大的,但我來了這裏的情況稍有不同,這個解決方案並不是我想要的。

我使用默認值的唯一時間我添加新列到表中。在任何其他情況下,我將不會使用該默認值。所以我不想有一個觸發器。

我認爲在這種情況下,唯一的選擇是默認值爲0(或任何特定的值)。然後使用計算所需的值更新所有這些新插入的0。

最後,將該新列的默認值更新爲現在需要的值。