如何将 "MONTHNAME()" 函数设置为 MySQL 中的列默认值?

How do I set "MONTHNAME()" function as column default in MySQL?

实际上我需要当前月份名称作为小写字符串作为table列之一的默认值; DB table 可能看起来像:

name : john
joined : january

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

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

来自MySQL documentation:

With one exception, enclose expression default values within parentheses to distinguish them from literal constant default values.

因此,以下应该有效:

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

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

你可以试试下面

CREATE TABLE orderdata (

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

);

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

... the default value specified in a DEFAULT clause must be a literal constant; it cannot be a function or an expression.

详见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 以了解建议的解决方案。