【问题标题】:auto increment or update age column every year mysql每年自动增加或更新年龄列mysql
【发布时间】:2014-10-04 01:43:16
【问题描述】:

我想询问有关更新表中年龄列的问题。是否可以根据我表中的出生日期列每年自动更新年龄。年龄列和出生日期列在同一个表中。但如果不可能,也许我每次选择年龄列时都会更新年龄表,并从出生日期列计算年龄。我只是有点好奇是否有一种即时的方法。

【问题讨论】:

  • 不要使用年龄列;记录出生日期,并据此计算年龄。
  • 您可以使用事件调度器定期更新年龄列。
  • @JonathanLeffler 是的,我也是这么想的。但我有点好奇有没有办法做到这一点。如果不可能,也许我只是删除年龄列
  • 如果您使用(可能是自定义的)函数,您可以按需确定年龄。除非您的年龄标准类似于“8 月 31 日的年龄”,否则年龄会不断变化,因此您必须每天调整一些年龄(如果您想要整年的年龄)。你通常最好使用一个函数。
  • 谢谢大家。看完spencer的解释,我会使用基于DOB的select方法。

标签: mysql sql


【解决方案1】:

不要存储“年龄”。如果您有 DOB 列,则“年龄”只是当前日期和时间与 DOB 之间的差异。如果您想计算特定日期的“年龄”,那么它仍然是该日期与 DOB 之间的差异。

您可以使用 MySQL 内置的TIMESTAMPDIFF 函数来计算“年龄”的年数,例如:

SELECT TIMESTAMPDIFF(YEAR, '1993-10-01' ,NOW()) AS age_in_whole_years

在您的 DOB 列中替换该表达式中的文字。每当您运行包含此表达式的语句时,都会自动计算该值。没有比这更“自动”的了。

如果您需要根据年龄“搜索”,请改用 DOB 列上的谓词。要查找“年龄”小于 21 的行,则 DOB 小于 21 年前,即 DOB 大于今天的日期减去 21 年。例如

 WHERE t.dob  > NOW() - INTERVAL 21 YEARS

回答您提出的问题:

不,MySQL 中没有任何内容可以“自动递增或更新”存储在“年龄”列中的值。 (要更改存储在列中的值,您需要运行 UPDATE 语句。)您可以设置定期运行的计划任务,但该任务将需要发出 UPDATE 语句。如果你愿意,你可以称之为“自动”。

(足够聪明地设计数据库软件的人会考虑这样的事情;他们已经知道存储的“年龄”列的“自动递增”是一个坏主意,到处都是。已经有一个更好的解决方案。)

我很确定 StackOverflow 不会存储问题和答案的“年龄”、“1 小时前询问”或“4 个月前”发布。让他们翻阅表格,为每个问题、每个评论、每个答案更新一行……这太疯狂了。他们真正需要的只是存储发布的日期和时间,他们设置它并忘记它......没有更新语句的搅动,获得排他锁,生成撤消/回滚,写入重做日志,这只是敲打数据库。对于检索,他们已经在执行运行 SQL 以检索行的所有工作,发布的日期时间在那里,他们只是检索它,并且它对“年龄”计算的处理量可以忽略不计。

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多