如何将 "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.
因此,对于以前的版本,您需要另辟蹊径。例如,您可以定义一个 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 以了解建议的解决方案。
实际上我需要当前月份名称作为小写字符串作为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.
因此,对于以前的版本,您需要另辟蹊径。例如,您可以定义一个 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 以了解建议的解决方案。