【问题标题】:How do I set "MONTHNAME()" function as column default in MySQL?如何在 MySQL 中将“MONTHNAME()”函数设置为默认列?
【发布时间】:2019-04-23 15:45:24
【问题描述】:

实际上我需要将当前月份名称作为小写字符串作为表列之一中的默认值; DB 表可能如下所示:

name : john
joined : january

当我尝试使用 mysql 函数 LOWER( MONTHNAME( NOW() ) ) 作为默认值时,这给了我错误。 顺便说一句,我对创建触发器不感兴趣。

有什么神奇的查询可以做到这一点?

【问题讨论】:

  • 你的 MySQL 版本是多少?
  • 目前我使用的是 MySQL 5.7.*,通过接受的答案我知道我做不到,但如果你有任何技巧,请务必发布答案。
  • 顺便说一句,我可以在 MariaDB 10.3(仍在使用 MySQL 5.7.*)的问题中准确说明,添加此评论以帮助使用 MariaDB 的人

标签: mysql default default-value


【解决方案1】:

来自 MySQL documentation

除了一个例外,将表达式默认值括在括号内,以区别于文字常量默认值。

所以,以下应该可以工作:

CREATE TABLE yourTable (
    month_name VARCHAR(12) DEFAULT (LOWER(MONTHNAME(NOW())))
    ...
)

正如@Madhur 所指出的,使用表达式作为默认值只能从 MySQL 8 开始工作。

【讨论】:

  • 我认为需要补充一点,它只适用于 8.0.13 及更高版本。
  • 谢谢,这很有帮助,但不幸的是我正在使用 5.7.*,有什么解决方案吗?
  • 我认为您需要使用触发器。
【解决方案2】:

如果您使用 MySQL 8.0 或更高版本,那么 @TimBiegeleisen 和 @fa06 提供的答案应该可以解决问题。否则

... DEFAULT 子句中指定的默认值必须是文字常量;它不能是函数或表达式。

详情见documentation

因此,对于以前的版本,您需要找到另一种方法。例如,您可以定义一个trigger,如果未指定该值,则为该列设置默认值:

CREATE TABLE MyTable (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  joined  VARCHAR(12)
);

CREATE TRIGGER defaultMonth
BEFORE INSERT ON MyTable
FOR EACH ROW 
SET NEW.joined = IFNULL(NEW.joined, LOWER(MONTHNAME(NOW())));

有关建议的解决方案,另请参阅 live example

【讨论】:

    【解决方案3】:

    你可以试试下面

    CREATE TABLE orderdata (
    
        order_date DATE
      , order_month VARCHAR(50) AS (lower(MONTHNAME(order_date))) 
    
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2019-02-06
      • 2020-07-24
      相关资源
      最近更新 更多