【问题标题】:Performing Calculation in Default MySQL Value在默认 MySQL 值中执行计算
【发布时间】:2012-08-23 04:44:09
【问题描述】:

有没有办法使用 MySQL 的 Default Value 属性(即列定义上的 DEFAULT 子句)基于相同或不同表中其他列的值执行计算?

我们可以为任何列设置静态默认值,但我们可以执行计算或查询其他表的数据吗??

编辑

假设一个表的列为marks,其他列为total_marks,第三列为percentage。如何设置percentage的默认值由前两列计算

【问题讨论】:

  • 是的。如果您提供更多信息,也许我们可以为您提供更多想法。

标签: mysql database


【解决方案1】:

没有。 DEFAULT 子句的值必须是常数。 (此规则的一个例外是使用CURRENT_TIMESTAMP 作为TIMESTAMP 列的默认值。)

作为替代方法,您可以在插入或更新行时使用 TRIGGER 为列设置值。

例如,在 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 设法解决所问的问题:)
  • 我也相信触发器是可行的方法,但我想知道默认值是否可以处理它。估计不行。
  • 我在运行它时遇到了麻烦,直到我理解了我在使用分隔符时遇到的问题。见dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html,上面写着“如果你使用mysql程序定义了一个执行多条语句的触发器,则需要重新定义mysql语句分隔符,以便你可以在触发器定义中使用;语句分隔符”。
【解决方案2】:

触发解决方案很棒,但我来到这里的情况略有不同,并且该解决方案不是我想要的。

我使用默认值作为唯一一次将新列添加到表中。在任何其他情况下,我都不会使用该默认值。所以我不想触发。

我认为在这种情况下,唯一的选择是将值默认为 0(或任何特定值)。然后用计算所需的值更新所有这些新插入的 0。

最后,从现在开始将该新列的默认值更新为所需的值。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2015-06-15
    • 2021-07-01
    • 1970-01-01
    • 2012-01-03
    • 2022-07-19
    • 2012-09-28
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多