如何在MySQL中将“ MONTHNAME()”函数设置为列默认值?

时间:2018-11-21 05:41:43

标签: mysql default default-value

实际上,我需要在表列之一中将当前月份的名称作为小写字符串作为默认值; 数据库表可能类似于:

name : john
joined : january

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

有任何魔术查询可以做到吗?

3 个答案:

答案 0 :(得分:2)

从MySQL documentation

  

除一个例外,将表达式默认值括在括号内,以将其与文字常量默认值区分开。

因此,以下方法应该起作用:

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

正如@Madhur所指出的那样,使用表达式作为默认值仅适用于MySQL 8及更高版本。

答案 1 :(得分: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

答案 2 :(得分:0)

您可以在下面尝试

CREATE TABLE orderdata (

    order_date DATE
  , order_month VARCHAR(50) AS (lower(MONTHNAME(order_date))) 

);