2012-08-28 58 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。

最后,将该新列的默认值更新为现在需要的值。